1.使用多線程需要包含頭文件
#include
2.創建線程執行的函數
- void *func(void *arg)// *arg傳參
- {
- }
3.創建線程
- #include
- int pthread_create(pthread_t * tidp, const pthread_attr_t *attr, void *(*start_rtn)(void *), void *arg);
tid : 線程tid
attr: 線程的屬性,NULL 使用默認的屬性,如下可構造一個屬性結構體
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
- pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
srart_rtn :線程執行的主題函數
arg :外部傳給srart_rtn的參數
注意:attr使用完後記得執行 pthread_attr_destroy(&attr);
4.線程退出
4.1線程執行完後隱式退出
4.2由線程本顯示調用pthread_exit函數退出
pthread_exit(void *retval)
4.3其他程序調用pthtead_cancel(指定pid)
pthread_canel(pthread_t thread)
5.一個線程等待另一個線程退出
吐過一個線程要等待另一個線程的終止,可以使用pthread_join(),該函數的作用是調用pthread_join的線程將被掛起直到等待的線程終止退出
6.線程互斥
- int aaa;//多線程共享的全局變量
- pthread_mutex_t mutex;//互斥量,這個應該也是全局變量
- pthread_mutex_init(&mutex,NULL);//按默認屬性初始化互斥變量
- //對全局變量aaa上鎖
- pthread_mutex_lock(&mutex);
- ...對aaa的操作
- pthread_mutex_unlock(&mutex);
7.線程同步
同步是指一個線程等待某件事情的發生,只有當等待的事件發生了線程才繼續執行,否則線程一直掛起並放棄CPU,
pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *attr);
等待條件發生
pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex);
廣播條件已經發生
pthread_cond_broadcast (pthread_cond_t *cond) ;
解除某個等待線程
pthread_cond_signal (pthread_cond_t *cond) ;
釋放條件變量資源
pthread_cond_destroy
例子
- pthread_cond_t cond_audio_start;//
- pthread_mutex_t audio_mutex;//
- pthread_mutex_init(&audio_mutex, NULL);//初始化
- pthread_cond_init(&cond_audio_start, NULL);//初始化
- //等待條件發生
- pthread_cond_wait(&cond_audio_start, &audio_mutex);
- pthread_mutex_unlock(&audio_mutex);//釋放
- //使用完 回收資源
- pthread_mutex_destroy(&audio_mutex);
- pthread_cond_destroy(&cond_audio_start);
下面我們還是以名的生產者/消費者問題為例來闡述Linux線程的控制和通信。一組生產者線程與一組消費者線程通過緩衝區發生聯繫。生產者線程將生產的產品送入緩衝區,消費者線程則從中取出產品。緩衝區有N 個,是一個環形的緩衝池。
注意:編譯是加-lpthread 選項
最後祝所有程序員都能夠走上人生巔峰,讓代碼將夢想照進現實。如果大家對於學習C語言的學習方法,學習路線還有以後發展問題有任何疑問可以隨時問我,工作不忙的時候希望可以給大家解惑。關注我的頭條號,私信給我【C語言】我會發你係統學習資料以及交流學習的地址。
閱讀更多 編程學習 的文章