2011-11-23 88 views
1

我使用boost C++編寫線程之間的數據交換。爲多線程程序提升非阻塞式讀寫例程

某些線程需要異步讀取或寫入某些數據結構。

例如,我們有線程1和線程2

當線程1只需要得到線2的一些數據,如果數據仍然不可用於線程1, 它不應該被阻塞,做其他事情,然後再返回來再次檢查數據。

同樣的事情是線程2

有什麼提升的API例程非阻塞讀寫,這能做到嗎?

我在boost文件中找不到它。

我發現這裏的東西對於Solaris:

http://www.shrubbery.net/solaris9ab/SUNWdev/MTP/p31.html

我需要的API程序,可以支持:

(1)張貼在第一 (2)做其他事情的讀寫程序 (3)然後回去檢查數據是否可用

謝謝

回答

0

如果結構是標準容器,則可以跟蹤容器大小。如果它大於以前的檢查,則會有新的數據。

如果您從文件描述符中讀取數據,請將其設置爲非阻塞。然後從它們讀取將返回錯誤EAGAINEWOULDBLOCK

編輯正如另一張海報所說,你總是可以使用一個mutex。嘗試鎖定互斥鎖,如果失敗繼續做其他工作。

編輯2如果容器的大小是靜態的,那麼你需要一些其他信號或線程之間的通信。想到互斥/條件變量,或者向容器添加一個標誌,說明它已被修改。只有容器中有一個閱讀器時,容器中的標誌才起作用,因爲閱讀器應該在完成時清除標誌。

+0

數據容器大小是相同的,但其內容在每次迭代時都不相同。 – user1002288

+0

@ user1002288你可以修改容器來告訴它有一個標誌是否有新的內容? –

0

什麼是增強非阻塞讀寫的API例程,它可以做到這一點?

誰說有什麼?通常由您來創建這樣的更高級別的功能。 Boost.Thread用於創建線程並管理它們之間的同步通信。

你可以使用一對互斥體輕鬆地構建它。當生產者線程完成生產數據時,它釋放對互斥鎖的鎖定,從而允許消費者線程開始消費。您可以使用其他互斥鎖來阻止生產者在消費者完成消費之前將新數據生成到緩衝區中。

+0

如何讓數據生產者通知消費者新數據可用,以便儘可能快地告知消費者? – user1002288

+0

@ user1002288:這取決於你。您的消費者線程無法開始處理其他東西;它必須停止並定期檢查是否有可用的東西。你確定你不只是希望你的消費者能夠阻止互斥體,而是放棄它的時間片到其他線程去做你正在談論的「其他工作」?這可能是一種更有效的方法,而不是不斷地查詢互斥量。 –

+0

我需要非阻塞讀取/寫入大型數據結構的元素,這是一個stl :: map 。在某個時間點,每個線程需要讀取/寫入地圖的一個元素,例如,地圖[i]中。我需要只鎖定元素map [i]而不是其他元素的互斥鎖,因爲其他線程可能需要同時讀取/寫入它們。 – user1002288