我正在阅读以下示例中的互斥保护: -
访问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 :(得分:0)
该示例假设您将生成线程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