2014-10-16 28 views
1

我有一個多線程程序,這些線程的工作可能需要相當長的時間。函數內部的pthread_exit()

如果我想停止程序的執行,我有一個原子開關,我從0更改爲1,這將指示它應該退出的線程。這目前得到檢查在一個while循環。

但是,while循環的迭代可能需要相當長的時間。現在我想要在while循環中基本定義一些'優雅'退出點。

基本上我會定義一個宏短這樣的,其中ks爲開關:

#define GRACE_EXIT(ks) \ 
    if (__atomic_load_n(ks, __ATOMIC_SEQ_CST) == 1) \ 
     pthread_exit(NULL); 

現在,我不知道是否被允許從我從線程中調用函數調用它。

基本上在while循環內調用各種函數。我遇到的基本問題是,如果允許從不是線程入口點的函數內調用pthread_exit()。我所關心的第二個問題是清理不在調用函數範圍內的自動變量。

讓我們說我是4個'深'的函數並且調用這個宏。即使它們不在範圍內,是否所有自動變量都被清除了?

+0

如果'pthread_exit'只能在線程入口函數中使用,那就完全沒用了。你可以在那裏使用'return'。 – 2014-10-16 13:54:40

+0

的確如此。但它不會是我第一次看到這樣的設計決定...... – 2014-10-16 13:56:15

回答

1

只要線程被連接或分離,您就可以從線程中的任意位置安全地調用pthread_exit()。但是,您分配的或您擁有的任何句柄和內存都不會被釋放。

pthread_exit()函數將終止調用線程,並使值value_ptr可用於任何成功的與終止線程的連接。任何已經被推送但尚未彈出的取消清除處理程序應按照相反的順序彈出,以便它們被推送然後執行。所有取消清除處理程序執行完畢後,如果線程具有任何線程特定的數據,則應以未指定的順序調用適當的析構函數。線程終止不釋放任何應用程序可見進程資源,包括但不限於互斥鎖和文件描述符,也不執行任何進程級別的清理操作,包括但不限於調用任何可能存在的atexit()例程。

唯一的例外是:

了pthread_exit()的行爲是不確定的,如果從被援引作爲隱式或顯式調用了pthread_exit的結果取消清理處理或析構函數調用() 。

+0

因此,只要我清理了我在堆上分配的內存,就可以安全地執行此操作。堆棧變量是自己清理的? – 2014-10-16 12:28:38

+0

@ rowan.G當然可以。你必須正確地結束線程,加入或分離。 – 2501 2014-10-16 12:30:48

+0

@alk對。固定。 – 2501 2014-10-16 12:51:22

0

所以,你有你的線程的主要功能使用foo,然後裏面foo你打電話bar,這裏面有pthread_exit(NULL);?應該工作正常。

這主要是針對其他人的:如果您在該線程中打開一個新線程以退出第一個線程,則不會工作。