2013-04-25 63 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