【问题标题】:Mutexes in c++ using wxwidgetsc++ 中使用 wxwidgets 的互斥锁
【发布时间】:2012-04-27 09:06:14
【问题描述】:

我正在阅读以下关于互斥保护的示例:-

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

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

【问题讨论】:

  • 你是什么意思:“运行同一线程的不同副本”。这对我来说似乎没有意义......
  • 假设汽车是一个类,并且有几辆汽车试图进入狭窄的车道,例如 MyThread 是一个类,因此可能有多个线程
  • 我猜“相同线程”是指相同的类类型(从 wxThread 派生),因为在 wxWidgets 中,您通过从 wxThread 继承来创建线程类。此类类型的每个对象都将启动一个单独的线程。或者,如果你有不同的类从 wxThread 继承,那么这些类型的每个对象都会启动新线程。

标签: c++ wxwidgets mutex


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-08-10
    • 2022-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多