在C ++中使用关键部分/信号量

时间:2013-04-25 10:04:06

标签: c++ initialization semaphore critical-section

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

与Delphi相反,C ++没有单元初始化/完成的概念(但你已经发现了这一点)。

我们留下的是非常少的。你需要区分两件事:

  • 你声明你的变量(全局,静态类成员,类成员,函数本地,函数中的静态 - 我想这涵盖了所有)
  • 初始化变量的地方(因为你关心C API,你必须自己调用初始化函数)

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

在你的情况下,我可能会使用singleton pattern。但是C ++就是这样,单身人士在初始化过程中遇到竞争条件,没有干净的方法。因此,除了单例之外,在开始在多线程上下文中使用它之前,应确保正确创建。在getInstance()开始时对main()进行简单的调用即可(或您认为合适的任何其他地方)。如您所见,这只需要关注声明变量的位置,而不是初始化的位置,但遗憾的是C ++在多线程方面存在重要的局限性(它在 - 指定)所以没有办法解决这个问题。

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

答案 1 :(得分:0)

在我看来,您只需要一个关键部分来将更新与各个线程的列表框同步。鼠标会继续移动。信号量不适合解决方案。您初始化类构造函数中的关键部分。列表框的位置。编写一个方法来更新列表框。

//psudo code
UpdateListBox()
{
 //enter critical section
 //update
 //leave critical section
}

所有线程都会调用此方法来更新列表框。

关键部分的信息在这里 http://msdn.microsoft.com/en-us/library/windows/desktop/ms683472%28v=vs.85%29.aspx