2011-04-07 73 views
3

我在寫一個使用POSIX線程庫的程序。我執行系統調用的一些返回值,如:在多線程程序中退出程序

if (pthread_join(temp, NULL) != 0) { 
    cerr << "system error\n" << endl; 
    exit(1); 
} 

我希望程序當CPU決定切換到不同的狀態,如果它通過這個時候馬上退出,但有可能是一個問題在'exit(1)'命令之前進行線程。
有沒有辦法保護這種情況?

使用一個特殊的互斥體對此沒有幫助,因爲: 1.我有很多這樣的調用和鎖定每個都會使代碼非常慢,效率低下,而且大多數 - 非常醜陋! 2.每個互斥鎖都需要自己的返回值檢查!所以這顯然不能解決最初的問題。
任何幫助的想法?

+2

爲您設置了格式化代碼。將來,請花時間自己做。它只花了我約3秒鐘。 – 2011-04-07 15:37:05

+0

你能解釋比賽條件嗎?我沒有看到這裏顯示的任何問題。即使內核切換,它會回來,程序將(最終)退出。這是一些可怕的波動或時間敏感的東西? – 2011-04-07 15:37:44

+0

@Jenna請解釋爲什麼你需要防止潛在的上下文切換。 – NPE 2011-04-07 15:38:07

回答

1

使用GCC atomic寫入常用變量。每個線程應該定期檢查這個變量。如果此變量已更改,請退出該線程。當所有其他線程完成時,主線程退出。

One more link.

+0

問題是調度程序可能會將我帶到不同線程的代碼中的任何位置。因此,我不能只在每個代碼行之前檢查此變量。 – Zach 2011-04-07 15:45:37

+0

@Jenna:在這種情況下:用於更改公共值由原子和所有退出點使用'pthread_exit'。策略是相同的:如果標記變量不爲null,則所有其他線程都應以相同的方式退出。如果所有線程都退出,則應用程序也退出。 – Naszta 2011-04-07 15:50:25

+0

你甚至不需要使用原子,使用普通的普通全局工作原理是一樣的。原子性只對併發性很重要,在這種情況下沒有。每隔一段時間檢查一次全局(例如,在工作線程中,每次在從隊列中提取任務之前)通常都會非常好。如果這還不夠好,您仍然可以爲每個線程安裝一個信號處理程序,並使用'pthread_kill'向每個線程發送一個信號(最好不是SIGTERM,因爲這會終止整個過程)。 – Damon 2011-04-07 16:01:24