2013-04-02 149 views
2

我有關於退出while循環的問題。我正在編寫代碼,在其中創建兩個線程,打印字符串,main()部分必須每500毫秒打印一次點(「。」)。你能幫我在第二個線程終止後如何退出while循環,在輸出上得到這樣的結果: ...你好...世界....結束如何終止無限循環(線程)

謝謝你的幫助。

int main() 
{ 
    int mls = 0.5 ; 
    pthread_t thread1; 
    pthread_t thread2; 

    struktura param1 = { "Hello", 2}; 
    struktura param2 = { "World", 4}; 

    pthread_create(&thread1, NULL, thread, &param1); 
    pthread_create(&thread2, NULL, thread, &param2); 

    while(1) 
    { 
     printf("."); 
     fflush(stdout); 
     sleep(mls); 
    } 

    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL); 

    printf("THE END\n"); 
    return 0; 
} 
+1

「int mls = 0.5」? 0.5是不是一個整數。 –

回答

-1

嘗試使用pthread_exit,如您在terminate c thread中所看到的。

+0

如果我理解正確,函數pthread_exit退出線程處理,但是如果線程2結束並且然後中斷循環,則需要在while循環中檢查。 – user2188452

+0

'pthread_exit()'在任何情況下都無助於解決OP的問題。 – alk

1
while(pthread_kill(thread1, 0) == 0 && pthread_kill(thread2, 0) == 0) 
{ 
     printf("."); 
     fflush(stdout); 
     sleep(mls); 
} 

int pthread_kill(pthread_t thread,int sig);

如果sig參數爲0,則可以使用此函數檢索線程的狀態,然後不發送信號,但仍會執行錯誤檢查(例如,您可以使用此檢查線程是否處於活動狀態)。它可以返回0或錯誤代碼(ESRCH-沒有線程可以找到ID線程,還有一個線程對於這種情況不重要),如果返回值是0而線程是'alive',如果返回的值是錯誤代碼(ESRCH)比指定的線程無法找到,例如。它'死了'。

+0

這適用於這種特殊情況。如果更多的線程被創建,運行,在同一個進程中獨立地終止這個問題,pthread-id被回收,它可能不再工作。所以'thread1'和/或'thread2'的值可能在兩個'while''測試之間被一個或兩個獨立運行的任務重用。更安全的解決方案是使用每個線程的條件/互斥體來表示其終止作爲最後一項任務進行下去。 – alk

2

經過對問題的思考後,我得出結論,如果主要用例確實是確保兩個線程(線程「Hello」和線程「World」)都不存在,那麼就沒有其他方法可以使用pthread_join()

由於pthread_join()阻塞調用線程,自然的結論是啓動第三個線程(線程「點」)以根據請求繪製點。

然後由main() -thread等待其他兩個線程(線程「Hello」和線程「World」)從兩個阻塞調用返回到pthread_join()後完成線程(線程「Dots」)的信號。如果這樣做,第三個線程(線程「Dots」)就完成了。後者可能會分離,因爲沒有人在等待它終止。