2010-08-30 70 views
1

我有一段代碼,它使用Boost線程來加速計算,但我需要調試它並希望以串行方式運行它們,而不是並行運行它們。我怎麼做?如何使Boost線程串行運行,而不是並行運行?

+3

Err ..只是不要通過線程啓動預期的子例程。 – 2010-08-30 21:55:46

+0

對於更一般的問題:[如何檢測和調試多線程問題?](http://stackoverflow.com/questions/499634/how-to-detect-and-debug-multi-threading-problems) – 2010-08-30 22:15:46

+3

Your鍵盤驅動程序有一個線程競爭問題。 – 2010-08-30 22:37:46

回答

1

除非我錯過了一些東西,只是使用單個線程進行調試。忘掉多線程,除非你正確地使用算法。

1

假設你的意思是「加速計算」,串聯運行的線程根本無助於性能。實際上,這會花費你在線程上的開銷,因爲你沒有對任何工作進行並行化。

如果你傾向於串行運行它們,只要確保每個人都在等待當前線程完成執行,然後再允許另一個運行呢?我可能在這裏錯過了一些東西。

+3

他希望串聯運行的線程能夠使調試更容易。因此,「但我需要調試它,並希望將它們串聯起來」作爲他第一句話的一部分。假設他在修復bug後需要重新啓用並行線程是安全的。 – 2010-08-30 22:47:42

+0

正是我的意思。謝謝你,埃米爾。 – gt6989b 2010-09-01 12:38:26

1

您可以爲每個線程創建一個信號量,然後在主線程中發出第一個信號量,並且每個線程都可以在其末尾發信號通知下一個信號量。

但是,仍然,爲什麼你需要這樣調試你的應用程序?在所有線程運行的情況下調試應用程序非常有用,以便您可以查看是否有任何競爭情況發生,或者類似的情況。

+0

我想知道你是否可以使用一個簡單的系統調用來強制它在1個線程中運行,就像下面提出的MSalters一樣。 – gt6989b 2010-09-01 12:39:13

+0

那麼,在這種情況下,只需設置斷點即可。它會給你那種經驗。 – Gianni 2010-09-01 20:25:16

1

在所有線程中放置斷點。您的調試器應該有一個命令來逐步執行或啓動一個線程。其餘的線程將保持暫停狀態,因此它們不會干擾您的單線程調試。一旦一個線程終止,您可以恢復所有線程,或者您可以在下一個線程中繼續調試。

+0

我想知道你是否可以使用一個簡單的系統調用來強制它在1個線程中運行,就像下面提出的MSalters一樣。 – gt6989b 2010-09-01 12:40:02

0

僅爲您的進程分配單個處理器內核。在Windows上,您可以使用SetProcessAffinityMask

+2

這不會確保他的線程將被序列化。 – tibur 2010-08-31 07:56:50

+0

正是我需要的。我想要獲得正確的boost調用,以迫使庫在一次運行1個線程的情況下(如果有的話)在Red Hat Linux上執行此操作。 – gt6989b 2010-09-01 12:40:45

+1

@ Gt6989b,儘管一次只能運行一個線程,但所有線程仍然處於活動狀態,這意味着OS調度程序可能會隨時選擇中斷某個線程,而讓其他線程運行。而不是以串行或並行方式運行,您的線程將運行* interleaved *。我很難分辨這是否真的是你想要的。 – 2010-09-01 14:22:55