c++ - 在 C++ 中使用临界区/信号量

标签 c++ initialization semaphore critical-section

我最近开始使用 C++ 而不是 Delphi。 而且有些东西看起来很不一样。 例如,我不知道如何初始化信号量和 CriticalSections 等变量。 到目前为止,我只知道两种可能的方法: 1. 在构造函数中初始化临界区是愚蠢的,因为每个实例都会使用自己的临界区而不同步任何东西,对吧? 2. 使用全局变量并在创建表单时对其进行初始化似乎也不是完美的解决方案。 谁能告诉我如何实现这一点?

只是对我需要的关键部分的简短解释: 我想从不同的线程中填充一个 ListBox。 信号量: 不同的线程正在移动鼠标,这不应该被打断。

谢谢!

最佳答案

与 Delphi 不同,C++ 没有单元初始化/终结的概念(但您已经发现了这一点)。

我们所剩无几。您需要区分两件事:

  • 声明变量的位置(全局变量、静态类成员、类成员、函数局部变量、函数中的静态变量——我想这涵盖了所有内容)
  • 在何处初始化变量(因为您关心的是 C API,所以必须自己调用初始化函数)

事实是,在您的情况下,您在哪里声明您的变量并不重要,只要您的程序的所有其他需要它的部分都可以访问它,唯一的要求是您在哪里应该初始化它是:在你真正开始使用它之前(这意味着,在你启动其他线程之前)。

在您的情况下,我可能会使用 singleton pattern .但是 C++ 就是这样,单例在初始化过程中会遇到竞争条件,没有干净的方法可以解决这个问题。因此,除了您的单例之外,您还应该确保它已正确创建,在您开始在多线程上下文中使用它之前。在 main() 开始时简单调用 getInstance() 即可(或您认为合适的任何地方)。如您所见,这只关心您在哪里声明您的变量,而不关心您在哪里初始化它,但不幸的是,C++ 在多线程方面有重要的局限性(它在-specified) 所以没有办法解决这个问题。

总结一下:做你想做的事(只要它有效),别担心。

关于c++ - 在 C++ 中使用临界区/信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16211879/

相关文章:

c# - 信号量实现

c++ - istream::read 未正确填充 char 数组

c++ - Boost::spirit 从非终结符获取值(value)

c++ - 在抛出 'std::regex_error' 实例后调用终止

c++ - const char * 对 vector<unsigned char> 的初始化

swift - 在扩展中的 Swift 中添加失败的可选初始值设定项

c++ - 如何在C++中初始化成员的构造函数参数

c - 信号量问题,不要等待

c++ - 用于 C++ GUI 桌面 Windows 应用程序的测试自动化工具/库/框架

c - 未命名信号量 POSIX IPC