使用 wxwidgets 的 c++ 中的互斥体
Mutexes in c++ using wxwidgets
我正在阅读以下示例以获取互斥保护:-
访问 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
相关文章:
- 什么是事件表 (wxWidgets)?
- 无法编译wxWidgets Hello World
- CMake WxWidgets项目成功地在Linux上构建,但没有在Windows上构建
- 内存所有位置 wxWidgets
- С++ wxWidgets:代码架构,设计原则和模式
- 将 Win32/WinAPI 应用程序移植到 wxWidgets
- 从 wxWidgets 中的.DLL加载图标
- 使用 Visual Studio 2019 构建 Hello World wxwidgets 应用程序时出错
- C++ wxWidgets:在创建小部件后设置字体
- C++ wxWidgets:更改大小器的字体
- meson-build:wxWidgets 资源文件,用于 Windows 未构建
- Visual Studio中的wxwidgets应用程序给出错误"LNK2019 unresolved external symbol"
- 如何在 wxWidgets 中使用 SetTabBehavior 进行C++?
- 在 wxWidgets 中的 wxTextCtrl 上手动触发 ENTER 键按下事件C++?
- 如何从代码本身向 wxwidgets 中的文本控件插入字符?
- wxWidgets 3.1.3 图标在 mac 下加载 - ICNS 文件不可读?
- wxWidgets 拖放文件事件处理程序初始化问题(无效static_cast)
- 如何将位图拉伸到父面板(wxWidgets 自定义)
- 使用标准窗口与wxWidgets一起绘制?
- 如何使用CLion和MSVC编译器工具链编译wxWidgets Hello World应用程序而没有错误?