簡體   English   中英

在C ++中使用關鍵節/信號量

[英]Using Critical Sections/Semaphores in C++

我最近開始使用C ++而不是Delphi。 而且有些事情似乎完全不同。 例如,我不知道如何初始化信號量和CriticalSections等變量。 到目前為止,我只知道兩種可能的方法:1.在構造函數中初始化關鍵部分是愚蠢的,因為每個實例都將使用其自己的關鍵部分而不進行任何同步,對嗎? 2.使用全局變量並在創建表單時對其進行初始化似乎也不是完美的解決方案。 誰能告訴我如何實現這一目標?

簡短說明一下我需要的關鍵部分:我想從不同的線程填充一個ListBox。 信號量:不同的線程在移動鼠標,不應中斷。

謝謝!

與Delphi相反,C ++沒有單元初始化/完成的概念(但您已經發現了這一點)。

我們剩下的很少。 您需要區分兩件事:

  • 在其中聲明變量的位置(全局,靜態類成員,類成員,函數局部,函數中的靜態-我想涵蓋了所有內容)
  • 在哪里初始化變量(由於您擔心C API,因此必須自己調用初始化函數)

事實是,在您的情況下,只要在需要它的程序的所有其他部分都可以訪問變量的地方聲明變量就無關緊要,而對於將變量初始化的位置的唯一要求是:在實際開始使用之前它(這意味着在啟動其他線程之前)。

在您的情況下,我可能會使用單例模式 但是C ++就是這樣,單例在初始化期間會遭受競爭條件的困擾,沒有解決之道。 因此,除了您的單例外,您還應確保在單線程上下文中開始使用它之前正確創建了 main()的開頭對getInstance()簡單調用就可以解決問題(或者在您認為合適的其他地方)。 如您所見,這只關心聲明變量的位置,而不是初始化變量的位置,但是不幸的是,C ++在涉及多線程時(未指定)有重要的限制,因此無法解決。

總結一下:只要做您想做的(只要它能起作用)就不要擔心。

在我看來,您只需要一個關鍵部分即可將來自各個線程的更新同步到列表框。 鼠標將繼續移動。 信號量不適合該解決方案。 您可以在類構造函數中初始化關鍵部分。 列表框在哪里。 編寫一種方法來更新列表框。

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

所有線程都將調用此方法來更新列表框。

有關關鍵部分的信息,請參見http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms683472%28v=vs.85%29.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM