的例子假定您将产生的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
你的意思是:“运行同一个线程的不同副本”。这对我来说似乎没有意义... – 2012-04-27 09:37:27
假设汽车是一个班级,并有几辆汽车试图进入狭窄的车道,例如MyThread是一个类,所以可能有多个线程 – 2012-04-27 09:54:58
我猜“相同的线程“你的意思是相同的类类型(从wxThread派生),因为在wxWidgets中,通过从wxThread继承来创建一个线程类。此类类型的每个对象都将启动一个单独的线程。或者如果你有不同的继承自wxThread的类,那么任何这些类型的每个对象都将启动新的线程。 – JohnPS 2012-04-27 10:21:56