关于初始化:在C中使用关键节/信号量

Using Critical Sections/Semaphores in C++

我最近开始使用C而不是Delphi。
而且有些事情似乎完全不同。
例如,我不知道如何初始化信号量和CriticalSections之类的变量。
到目前为止,我只知道2种可能的方式:
1.在构造函数中初始化关键部分是愚蠢的,因为每个实例都将使用其自己的关键部分而不进行任何同步,对吗?
2.使用全局变量并在创建表单时对其进行初始化似乎也不是完美的解决方案。
谁能告诉我如何实现这一目标?

仅简要说明我需要的关键部分:
我想从不同的线程中填充一个列表框。
信号量:
不同的线程正在移动鼠标,这不应被中断。

谢谢!


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

我们只剩下很少的东西了。您需要区分两件事:

  • 在其中声明变量的位置(全局,静态类成员,类成员,函数局部,函数中的静态-我想涵盖了所有内容)
  • 在哪里初始化变量(由于您关注C API,因此必须自己调用初始化函数)

事实是,在您的情况下,只要您的变量在程序中需要它的所有其他部分都可以访问,声明变量就无关紧要,而关于将变量初始化的唯一要求是:实际上开始使用它(这意味着在开始其他线程之前)。

在您的情况下,我可能会使用单例模式。但是C是它的意思,单身人士在初始化期间会遭受竞争状况的困扰,没有解决之道。因此,除了您的单例外,您还应确保在开始在多线程上下文中使用它之前正确创建了它。在main()的开头简单地调用getInstance()即可解决问题(或您认为合适的其他任何地方)。如您所见,这只关心声明变量的位置,而不是初始化变量的位置,但是遗憾的是C在涉及多线程时(它的指定不足)有重要的限制,因此无法解决。

总结起来:只要做您想做的事情(只要它可行),就不必担心。


我认为您只需要一个关键部分即可将来自各个线程的更新同步到列表框。鼠标将继续移动。信号量不适合该解决方案。您可以在类构造函数中初始化关键部分。列表框在哪里。编写一种方法来更新列表框。

1
2
3
4
5
6
7
//psudo code
UpdateListBox()
{
 //enter critical section
 //update
 //leave critical section
}

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

有关关键部分的信息在这里
http://msdn.microsoft.com/zh-CN/library/windows/desktop/ms683472(v = vs.85).aspx