硬體平台:pc機
軟體平台:windows7,realevo-ide
一般情況下,執行緒在其主體函式退出的時候會自動退出,但同時也可以因為接收到另乙個執行緒發來的取消請求而強制退出。
總結上述,單個執行緒可以通過3種方式退出:
sylixos相容絕大部分posix介面函式,因此可以直接呼叫以下函式:
函式原型:
#include
int pthread_join(pthread_tthread,void **ppstatus);
執行緒可以同步等待另乙個執行緒退出,並獲得其退出碼。需要注意的是,同步等待的 目標執行緒必須處於合併狀態,如圖 2-1所示。
圖2-1
執行緒同步等待
函式原型:
#include
void pthread_exit(void *status);
以指向乙個更複雜的資料結構體,執行緒結束碼將被另乙個與該執行緒進行了合併的執行緒得到。
函式原型:
#include
int pthread_cancel(pthread_tthread);
pthread_cancel()函式和目標執行緒的取消動作是非同步的,根據目標執行緒的設定不同,取消請求可能被忽略、立即執行或延遲處理。
sylixos中pthread_join()函式實現機制,如圖 3-1所示:
圖3-1 pthread_join()
函式實現流程
**中如果沒有pthread_join(),主線程會很快結束從而使整個程序結束,從而使建立的執行緒沒有機會開始執行就結束了。加入pthread_join()後,主線程會一直等待直到等待的執行緒結束自己才結束,使建立的執行緒有機會執行。所有執行緒都有乙個執行緒號,也就是thread id,其型別為pthread_t,通過呼叫pthread_self()函式可以獲得自身的執行緒號。
示例**如圖 3-2所示:
#include #include void *routine (void *arg)
void *routine1 (void *arg)
int main (int argc, char **argv)
/* 執行緒等待合併 */
iret = pthread_join(tid, &retval);
if (iret != 0)
fprintf(stdout, "thread 1 return code: %ld\n", (long)retval);
/* 建立routine1執行緒*/
iret = pthread_create(&tid1, null, routine1, null);
if (iret != 0)
/* 執行緒等待合併 */
iret = pthread_join(tid1, &retval);
if (iret != 0)
fprintf(stdout, "thread 2 exit code: %ld\n", (long)retval);
return (0);
}
圖3-2 pthread_join()
函式示例
在sylixos的shell下執行程式,結果如下:
#./join_test
thread 1 return.
thread 1 return code: 1
thread 2 exit.
thread 2 exit code: 2
用pthread_exit()來呼叫執行緒的返回值,用來退出執行緒,但是退出執行緒所佔資源不會隨便執行緒的終止而釋放資源。
pthread_exit()呼叫執行緒的返回值,可由其他函式如pthread_join()來檢索獲取。
示例**如圖 3-3所示:
#include #include void thread_1 (void)
sleep(1);
}}void thread_2 (void)
pthread_exit(0); /* 顯示呼叫pthread_exit */
}int main (int argc, char **argv)
/* 建立執行緒1 */
iret = pthread_create(&id_2, null, (void *)thread_2, null);
if(iret != 0)
pthread_join(id_1, null); /* 等待執行緒結束 */
pthread_join(id_2, null);
return (0);
}
圖3-3 pthread_exit()
函式示例
在sylixos的shell下執行程式,結果如下:
#./pthread_exit
this is a pthread_1.
this is a pthread_2.
this is a pthread_2.
this is a pthread_2.
this is a pthread_1.
this is a pthread_1.
執行緒的建立與退出
執行緒由兩部分構成 執行緒核心物件 作業系統用它來對執行緒實施管理。核心物件也是系統用來存放執行緒統計資訊的地方。執行緒堆疊 它用於維護執行緒在執行 時需要的所有函式引數和區域性變數。我們必需要知道乙個事實 程序 windows 中 是不能被排程的。通常所說的排程,都是對執行緒而言的。程序僅僅是執行...
boost asio io執行緒退出的問題
這兩天在review客戶端networkclient的 因為之前遇到了 斷開第一次鏈結後,再想鏈結就再也鏈結不上的問題。最後查到因為我的io service沒有構造出乙個 work,boost io serivice 需要有個io service work來keep住,如果沒有work,在一次啟動的...
執行緒退出的幾種方式
使用volatile型別的域來儲存取消狀態 因為volatile本身特性,每次修改都會立刻重新整理到快取中,這樣就可以保證執行緒任務可以及時看到 public class primegenerator implements runnable public void cancel public syn...