2010-06-27 53 views
2

在C和C++中編寫線程安全的UNIX代碼有哪些指導原則?編寫線程安全的UNIX代碼的提示?

我只知道幾個:

  • 不要使用全局
  • 不要使用靜態本地存儲

是什麼人呢?

+0

請標記投票問題的社區wiki'。 – danben 2010-06-27 14:23:18

+0

danben,完成。 s – bodacydo 2010-06-27 14:23:47

回答

6

簡單的事情是讀一點。以下列表包含一些需要查看和研究的內容。

  1. 花時間閱讀的Open Group Base Specification特別是General Information部分和subsection on threads。這是大多數UN * X類似系統下多線程的基本信息。
  2. 學習difference between a mutex and a semaphore
  3. 要認識到,共享MUST來保護這一切。這適用於全局變量,static變量以及任何共享的動態分配的內存。
  4. 將全局狀態標誌替換爲condition variables。這些使用pthread_cond_init和相關功能來實現。

一旦你瞭解的基礎知識,瞭解常見的問題,這樣,當它們出現,你可以識別它們

+0

哇,我基本上沒有聽說過你在這裏列出的任何東西!開始閱讀。 – bodacydo 2010-06-27 18:20:10

+0

這裏有很多信息。如果你想要更多的書籍,請在https://computing.llnl.gov/tutorials/pthreads/閱讀或購買「UNIX系統編程」(http://www.amazon.com/UNIX-Systems-Programming) - 通信併發/ DP/0130424110 /) – 2010-06-29 02:33:32

2

它真的歸結爲共享狀態,全局變量和靜態本地都是共享狀態的例子。如果你不分享國家,你就不會有問題。共享狀態的其他示例包括寫入文件或套接字的多個線程。

任何共享資源將需要妥善管理 - 這可能意味着使互斥鎖受到保護,打開另一個文件或智能地序列化請求。

如果兩個線程正在從同一個結構中讀寫,那麼您需要處理這種情況。

1

謹防sem_t函數,它們可能會返回未完成的中斷,IO,SIGCHLD等。如果您需要它們,請務必allways捕獲該情況。

pthread_mut_tpthread_cond_t功能相對於EINTR是安全的。

0

一個很好的關於併發性的一般書可以在這裏找到:Little Book of Semaphores

它提出了一步一步解決的各種問題,包括常見併發問題的解決方案,如飢餓,競爭條件等。 它不是語言特定的,但包含有關使用Pthread-Library或Python實現C中解決方案的簡短章節。