Linux多執行緒實踐 2 執行緒基本API

2022-04-29 19:18:10 字數 3135 閱讀 8956

與執行緒有關的函式構成了乙個完整的系列,絕大多數函式的名字都是以「pthread_」開頭,要使用這些函式庫,要通過引入頭文,而且鏈結這些執行緒函式庫時要使用編譯器命令的「-lpthread」選項[ubuntu系列系統需要新增的是」-pthread」選項而不是」-lpthread」,如ubuntu 14.04版本,深度ubuntu等]

1.pthread_create

int pthread_create(pthread_t *restrict thread,

const pthread_attr_t *restrict attr,

void *(*start_routine)(void*), void *restrict arg);

建立乙個新的執行緒

引數thread:執行緒id

attr:設定執行緒的屬性,一般設定為null表示使用預設屬性

start_routine:是個函式位址,執行緒啟動後要執行的函式

arg:傳給執行緒啟動函式的引數

返回值:成功返回0;失敗返回錯誤碼;

附-posix錯誤檢查

unix傳統的函式:成功返回0,失敗返回-1,並且對設定全域性變數errno以指定錯誤型別。然而pthreads函式出錯時不會設定全域性變數errno(而其他的大部分posix函式會設定errno)。而是將錯誤**通過返回值返回;

pthreads同樣也提供了執行緒內的errno變數,對於每乙個執行緒, 都有乙個errno的值, 以支援其它使用errno的**。對於pthreads函式的錯誤,建議通過返回值

進行判定,因為讀取返回值要比讀取執行緒內的errno變數的開銷更小!

/** 實踐: 新的錯誤檢查與錯誤退出函式 **/

inline void err_check(const std::string &msg, int retno)

inline void err_exit(const std::string &msg, int retno)

2.pthread_exit

void pthread_exit(void *value_ptr);
執行緒終止

value_ptr:指向該執行緒的返回值;注意:value_ptr

不能指向乙個區域性變數。

3.pthread_join

int pthread_join(pthread_t thread, void **value_ptr);
等待執行緒結束

value_ptr:它指向乙個指標,後者指向執行緒的返回值(使用者獲取執行緒的返回值)

/** 示例: 等待執行緒退出 **/

void *thread_rotine(void *args)

pthread_exit(null);

}int main()

ret = pthread_join(thread, null);

err_check("pthread_join", ret);

putchar('\n');

return 0;

}

4.pthread_self

pthread_t pthread_self(void);
返回執行緒id

/** 示例:主控執行緒與子執行緒傳遞資料 **/

typedef struct _student

student;

void *threadfunction(void *args)

int main()

; pthread_t thread;

//啟動建立並啟動執行緒

pthread_create(&thread,null,threadfunction,&student);

//等待執行緒結束

pthread_join(thread,null);

return 0;

}

5.pthread_cancel

int pthread_cancel(pthread_t thread);
取消乙個執行中的執行緒

6.pthread_detach

int pthread_detach(pthread_t thread);
將乙個執行緒分離-如果在新建立的執行緒結束時主線程沒有結束同時也沒有呼叫pthread_join,則會產生僵執行緒,次問題可以通過設定執行緒為分離的(detach)來解決;

總結:程序 vs. 執行緒

程序(pid_t)

執行緒(pthread_t)

fork

pthread_create

waitpit

pthread_join/pthread_detach

kill

pthread_cancel

pidpthead_self

exit/return

pthread_exit/return

殭屍程序(沒有呼叫wait/waitpid等函式)

殭屍執行緒(沒有呼叫pthread_join/pthread_detach)

/** 將併發echo server改造成多執行緒形式 

注意執行緒競速問題的解決

**/void echo_server(int clientsocket);

void *thread_routine(void *arg);

int main()

close(sockfd);

}

void *thread_routine(void *args)

void echo_server(int clientsocket)

; int readbytes;

while ((readbytes = read(clientsocket, buf, sizeof(buf))) >= 0)

if (write(clientsocket, buf, readbytes) == -1)

cout << buf;

bzero(buf, sizeof(buf));}}

其完整源**:download.csdn.net/detail/hanqing280441589/844076

Linux多執行緒實踐 7 多執行緒排序對比

int pthread barrier init pthread barrier t restrict barrier,const pthread barrierattr t restrict attr,unsigned count int pthread barrier destroy pthre...

Linux多執行緒實踐 7 多執行緒排序對比

int pthread barrier init pthread barrier t restrict barrier,const pthread barrierattr t restrict attr,unsigned count int pthread barrier destroy pthre...

Linux多執行緒程式設計(實踐)

下面先來乙個例項。我們通過建立兩個執行緒來實現對乙個數的遞加。或許這個例項沒有實際運用的價值,但是稍微改動一下,我們就可以用到其他地方去拉。下面我們先來編譯 執行一下 gcc lpthread o thread example thread example.c thread example 我是主函...