使用 wxwidgets 的 c++ 中的互斥体

Mutexes in c++ using wxwidgets

本文关键字:c++ wxwidgets 使用      更新时间:2023-10-16

我正在阅读以下示例以获取互斥保护:-

访问 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
运行

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

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