SylixOS單個執行緒的退出方式

2021-07-26 07:24:35 字數 2981 閱讀 1353

硬體平台: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...