该示例假设您将生成线程 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