2013-05-16 11 views
2

我目前正試圖將當前正在運行的線程限制爲最大值,例如,核心數量。C++信號量不考慮調用順序

這一切都做得很好,每秒我有100個完整的數據寫入(打開,追加,關閉),但是當不使用信號量作爲互斥量(數量大於1)時,順序或寫入訪問是canged。

使用一個for循環:

for(int i=0;i<10;i++) 
      mywrite.writeasnewthread("test.txt","asd"+mywrite.tostring(i)); 

其中writeasnewthread包含

WaitForSingleObject(this->semaphor,INFINITE); 
    CreateThread(NULL,0,&threadwrite,(void*)param,0,NULL); 

與threadwrite新的線程,含PARAM名稱,數據和信號。 然後在年底threadwrite我打電話

ReleaseSemaphore(writeparam->This->semaphor,1,NULL); 

然而,當我看到我在threadwrite寫的文件,有繼續這樣

2013-5-16 14:41:25 asd0 
2013-5-16 14:41:25 asd3 
2013-5-16 14:41:25 asd5 
2013-5-16 14:41:25 asd7 
2013-5-16 14:41:25 asd1 
2013-5-16 14:41:25 asd8 
2013-5-16 14:41:25 asd9 
2013-5-16 14:41:25 asd6 
2013-5-16 14:41:25 asd4 
2013-5-16 14:41:25 asd2 

東西,我可能有一些基本的認識誤區信號燈的工作原理,但我雖然線程將等待信號燈再次有一個空閒插槽,然後得到處理...

那麼,有沒有一種不錯的方式來保存文件的順序?還是會破壞信號燈的概念?

問候, 朱利安

+0

另外(羅伯特的答案是正確的),會有什麼用?如果寫入按嚴格順序執行,則不會獲得任何併發性! – Useless

+1

@Useless好吧,我計劃更好地使用使用線程的處理器,但現在我認爲一個互斥量就足夠了,所以一個額外的線程處理IO,主要的線程處理其他事務,以及確保存在的互斥量現在當保存大量數據時,沒有競爭條件就足夠了。 – Julian

+0

老實說,這些寫入是如此之小,它們可能比在不同線程中執行同步所需的同步更便宜。 – Useless

回答

5

嗯,簡單的答案是否定的。操作系統可以自由安排線程以任意順序執行,並且很可能不會按照您創建的順序執行。

4

信號量不會在持有信號量的各個線程之間強加任何關係。它只能限制一次可以成功獲取信號量的實體的數量。

信號量的定義與線程調度沒有任何關係。在你的例子中,信號量正常運行。

如果你想在文件中按特定順序寫入,爲什麼要使用線程呢?只要按照你想要的順序做主線程寫入,一切都會好起來的。

當您希望以未定義的順序發生時,使用線程。您可以使用互斥體,信號量,fifo等在這些線程之間施加一些排序,但是如果您想要一個嚴格的一個接一個的操作順序,您應該不會使用線程。