2013-04-25 66 views
0

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

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

谢谢!

+1

标准C++只有互斥锁和条件变量作为同步机制,分别在''和''中。你可以[建立你自己的信号](http://stackoverflow.com/questions/4792449/c0x-has-no-semaphores-how-to-synchronize-threads)。 – 2013-04-25 10:14:01

+0

所以问题不在于如何*初始化您的对象,而是*在哪里*,对吗?如果是这样,出于好奇,你在Delphi中做了什么? – syam 2013-04-25 10:26:15

+0

德尔福提供的关键字初始化和定稿,这使得它更容易imo – Henry 2013-04-25 10:28:26

回答

1

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

我们剩下的东西很少。你需要区分两种情况:

  • ,你(在全球的功能,静态类成员,类成员,函数的局部,静态的 - 我想这涵盖了全部)声明你的变量
  • 哪里你初始化变量(因为你关心的一个C API,你必须调用初始化函数自己)

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

在你的情况下,我可能会使用singleton pattern。但是C++就是这样,单身人士在初始化期间受到竞争状态的困扰,没有干净的方法。所以,除了你的单身人士,你应该确保在多线程环境中开始使用它之前,它已被正确创建。在main()开始时简单地拨打getInstance()就可以做到这一点(或者你认为合适的地方)。正如你所看到的,这只需要关心你的变量声明你的变量,而不是你初始化它的地方,但不幸的是C++在涉及到多线程(它是低于指定的)时有重要的限制,所以没有办法绕过。

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

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

+0

我假设你正在Windows上开发它 – Jack 2013-04-25 10:19:54

+0

如果我必须在类构造函数中初始化它,这是否意味着我必须使用全局变量并在其他单元中使用external关键字? – Henry 2013-04-25 10:31:04

+0

它不一定是全球性的。随时随地保存。只是这一点,你将不得不将它作为一个论证来进入关键部分和释放关键部分。 – Jack 2013-04-25 10:56:15