與執行緒有關的函式構成了乙個完整的系列,絕大多數函式的名字都是以「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變數的開銷更小!
/** 實踐: 新的錯誤檢查與錯誤退出函式 **/2.pthread_exitinline void err_check(const std::string &msg, int retno)
inline void err_exit(const std::string &msg, int retno)
void pthread_exit(void *value_ptr);執行緒終止
value_ptr:指向該執行緒的返回值;注意:value_ptr
不能指向乙個區域性變數。
3.pthread_join
int pthread_join(pthread_t thread, void **value_ptr);等待執行緒結束
value_ptr:它指向乙個指標,後者指向執行緒的返回值(使用者獲取執行緒的返回值)
/** 示例: 等待執行緒退出 **/4.pthread_selfvoid *thread_rotine(void *args)
pthread_exit(null);
}int main()
ret = pthread_join(thread, null);
err_check("pthread_join", ret);
putchar('\n');
return 0;
}
pthread_t pthread_self(void);返回執行緒id
/** 示例:主控執行緒與子執行緒傳遞資料 **/5.pthread_canceltypedef struct _student
student;
void *threadfunction(void *args)
int main()
; pthread_t thread;
//啟動建立並啟動執行緒
pthread_create(&thread,null,threadfunction,&student);
//等待執行緒結束
pthread_join(thread,null);
return 0;
}
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)其完整源**:download.csdn.net/detail/hanqing280441589/844076void 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));}}
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 我是主函...