2012-04-27 40 views
1

我在读下面的例子中,在互斥体保护: -互斥在C++中使用wxWidgets

访问http://docs.wxwidgets.org/2.8/wx_wxmutex.html#wxmutex

有一个注释代码这里: -

//we store some numbers in this global array which is presumably used by 
//several threads simultaneously 

是否运行几个线程意味着运行同一线程的不同副本(如果是这样,那么请帮助我这样做)或者具有不同功能的功能,但可以访问关键部分。

+0

你的意思是:“运行同一个线程的不同副本”。这对我来说似乎没有意义... – 2012-04-27 09:37:27

+0

假设汽车是一个班级,并有几辆汽车试图进入狭窄的车道,例如MyThread是一个类,所以可能有多个线程 – 2012-04-27 09:54:58

+0

我猜“相同的线程“你的意思是相同的类类型(从wxThread派生),因为在wxWidgets中,通过从wxThread继承来创建一个线程类。此类类型的每个对象都将启动一个单独的线程。或者如果你有不同的继承自wxThread的类,那么任何这些类型的每个对象都将启动新的线程。 – JohnPS 2012-04-27 10:21:56

回答

0

的例子假定您将产生的T多个实例,他线程MyThread的,这将发生变异的变量:因为多个线程访问,你需要处理同步的相同数据

wxArrayInt s_data; 

,与例如在互斥这个例子。

s_mutexProtectingTheGlobalList->Lock(); 

s_data.Add(num); 

s_mutexProtectingTheGlobalList->Unlock(); 

这样,只有1个线程能够同时访问数据,并且可以防止多线程问题。

如果你不这样做,有机会的话线程中断海誓山盟时可能使用的过时的数据,这里是一个基本的例子:

int a = 0; 

void foo() 
{ 
int b = a; 
b += 1; 
a = b; 
} 

,如果有2个线程使用相同的数据此功能,以下可能会发生:

thread 1: 
    reads a into b (a = 0, b = 0) 
    adds 1 to local b (a = 0, b = 1) 
    end of timeslice, switches to thread 2 
thread 2: 
    reads a into b (a = 0, b = 0) 
    adds 1 to local b (a = 0, b = 1) 
    writes b back into a (a = 1, b = 1) 
    end of timeslice/operation 
thread 1: 
    writes b back into a (a = 1, b = 1) 

,是因为2个线程拥有的数据,这在线程2的情况下副本过时, 他们将覆盖海誓山盟,所以不是一个为2,它是1 线程1