linux程序設計 線程 多線程編程 信號量

線程:
創建一個新線程:pthread_create
#include <pthread.h>
int pthread_create(pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)((void *),void *arg);
"void *(*start_routine)(void *)"表示需要傳遞的是一個函數的地址,該函數以一個指向void的指針爲參數,返回的也是一個指向void的指針。再就是新線程將要執行的函數。
調用成功返回0,調用失敗返回錯誤,

※※※ pthread_create和大多數與線程有關的函數在操作失敗時不返回“-1”。

結束一個線程:
void pthread_exit (void *retval);

int pthread_join(pthread_t th, void **thread_return);相當與用來等待子進程的wait函數,它的作用時在線程結束後把它們歸併在一起。第一個參數是將有等待的線程,它就是pthread_create返回的那個標識符。第二個參數是個指針,它指向另外一個指針,而後者指向線程的返回值。


同步方法:
第一種:信號量;
第二種:互斥量;

信號量函數的名字都以"sem_"打頭。線程使用的基本信號量函數有四個。
#include <semaphore.h>
int sem_init (sem_t *sem , int pshared, unsigned int value);
這是對由sem指定的信號量進行初始化,設置好它的共享選項(linux 只支持爲0,即表示它是當前進程的局部信號量),然後給它一個初始值VALUE。

兩個原子操作函數:
int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);
這兩個函數都要用一個由sem_init調用初始化的信號量對象的指針做參數。
sem_post:給信號量的值加1;
sem_wait:給信號量減1;對一個值爲0的信號量調用sem_wait,這個函數將會等待直到有其它線程使它不再是0爲止。

int sem_destroy(sem_t *sem);
這個函數的作用是再我們用完信號量後都它進行清理。歸還自己佔有的一切資源。

互斥量進行同步:
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destory(pthread_mutex_t *mutex);


線程屬性:
#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr);
這個函數的作用是對一個線程屬性對象進行初始化。


int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param
*param);
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param
*param);
int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit);
int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit);
int pthread_attr_setscope(pthread_attr_t *attr, int scope);
int pthread_attr_getscope(const pthread_attr_t *attr, int *scope);
int pthread_attr_setstacksize(pthread_attr_t *attr, int scope);
int pthread_attr_getstacksize(const pthread_attr_t *attr, int *scope);

detachstate屬性:這個屬性允許我們不對線程進行重新歸併。pthread_attr_setdetachstate用到的兩個標誌分別爲:
PTHREAD_CREATE_JOIN:缺省設置是這個,允許兩個線程歸併;
PTHREAD_CREATE_DETACHED:設置成這個就不能調用pthread_join來檢查另一個線程的退出狀態了。

schedpolicy屬性:控制線程的時間分配方式。它的可用取值是:
SCHED_OTHER:缺省值,另外兩個只能使用以超級用戶運行的進程裏。
SCHED_RP:輪轉定時
SCHED_FIFO:先入先出

schedparam屬性:它是schedpolicy屬性的一個搭檔,它對以SCHED_OTHER定時策略運行的線程的時間分配進行控制。

inheritsched屬性:可用值有兩個:
PTHREAD_EXPLICT_SCHED:缺省,表示時間分配由屬性來明確設置
PTHREAD_INHERIT_SCHED:表示沿用它創建者的參數。

 


取消一個線程:
#include <pthread.h>
int pthread_cancel (pthread_t thread);

接收取消的線程可通過pthread_setcancelstate設置自己的取消狀態:
int pthread_setcancelstate(int state ,int *oldstate);
第一個參數:PTHREAD_CANCEL_ENABLE:允許取消;
PTHREAD_CANCEL_DISABLE:屏蔽取消消息。
old_state 可設置爲NULL;

如果取消被接受了,用pthread_setcanceltype設置取消類型;

int pthread_setcanceltype(int type, int *oldtype);
 type參數有兩種取值:
PTHREAD_CANCEL_ASYNCHRONOUS:接收取消請求後立即行動。
PTHREAC_CANCEL_DEFERRED:在行動之前執行以下幾個函數之一:pthread_join,pthread_cond_wait,pthread_cond_tomewait,pthread_testcancel,sem_wait,sigwait.

 

發佈了28 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章