Linux多執行緒程式設計

2022-09-16 04:03:16 字數 3027 閱讀 1541

作為多工實現的一種機制,多執行緒應用得非常廣泛,相對於多程序,多執行緒不僅執行效率高,而且還可以提高系統資源的使用效率。雖然網上關於多執行緒的講解已經有一大堆,但出於學習的心態,有必要在這裡做一下筆記。

一、多執行緒程式設計常用函式

1. int pthread_create(pthread_t * thread,const pthread_attr_t * attr,void * (*start_routine)(void *), void *arg);作用:建立乙個新執行緒

引數:thread:執行緒id

void * (*start_routine):執行緒函式指標

*arg:執行緒函式引數的指標

返回值:

0:表示建立成功

其他:表示建立失敗失敗

2. int pthread_join(pthread_t th, void **thread_return);

作用:等待其他執行緒終止

引數:th:需要等待的執行緒的id

thread_return:所等待的執行緒的返回值

返回值:

0:表示成功

其他:表示失敗

3. void pthread_exit(void *retval);

作用:終止當前執行緒

引數:retval:執行緒的返回值

4. int pthread_mutex_lock(pthread_mutex_t *mutex);

作用:上鎖,如果鎖不可用則會阻塞當前執行緒直到鎖可用

引數:mutex:互斥變數

5. int pthread_mutex_unlock(pthread_mutex_t *mutex);

作用:與pthread_mutex_lock()相反

6. pthread_t pthread_self(void);

作用:返回當前執行緒id

返回值:

當前執行緒id

7. int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

作用:解鎖mutex,等待條件變數cond被發出訊號

引數:cond:條件變數

mutex:互斥鎖物件

在呼叫此函式之前要先獲得互斥鎖,呼叫此函式時會自動釋放互斥鎖以防止死鎖,這就是為什麼此函式與互斥鎖聯絡在一起的原因。另外此函式呼叫成功後當前執行緒會被掛起並放棄cpu,因此在等待的過程中是不會占用cpu資源的,當條件滿足(被喚醒)時會重新上鎖。

8. int pthread_cond_signal(pthread_cond_t *cond);

作用:重新開始(喚醒)正在等待條件變數cond的執行緒

引數:cond:條件變數

二、例項要求:在主線程裡建立兩個子執行緒,其中乙個子執行緒輸出1,3,5,7,9,另乙個子執行緒輸出2,4,6,8,10,輸出的順序是1,2,3,4,5,6,7,8,9,10。兩個子執行緒都退出後主執行緒才退出。

1 #include 2 #include 3 #include 456

//初始化互斥鎖

7 pthread_mutex_t count_mutex =pthread_mutex_initializer;8//

初始化條件變數

9 pthread_cond_t condition_var =pthread_cond_initializer;

10//

初始化計數變數

11int num = 1;12

13//

執行緒1的執行緒函式

14void *thread1(void *arg)

1527

else

28//

解鎖,等待

29 pthread_cond_wait( &condition_var, &count_mutex );

30//

解鎖31 pthread_mutex_unlock( &count_mutex );

32if(num > 10)33

return

null;34}

3536}37

38//

執行緒2的執行緒函式

39void *thread2(void *arg)

4052

else

53//

喚醒正在等待的執行緒

54 pthread_cond_signal( &condition_var );

5556

//解鎖

57 pthread_mutex_unlock( &count_mutex );

58if(num > 10)59

64}6566}67

6869

intmain()

7080

81//

建立執行緒2

82 ret = pthread_create(&t2,null,thread2,null);

83if(ret != 0

)

8487

88//

等待執行緒1結束

89 ret =pthread_join(t1,null);

90if(ret != 0)91

9495

//等待執行緒2結束

96 ret =pthread_join(t2,null);

97if(ret != 0)98

101102

return0;

103 }

編譯後執行,結果如下:

Linux 多執行緒程式設計

1.建立執行緒和退出的函式原型 int pthread create pthread t thread,pthread attr t attr,void start routine void void arg pthread exit 0 其他還有很多相關的函式。2.編譯時要加上 lpthread ...

Linux多執行緒程式設計

linux 多執行緒程式設計 多執行緒支援 posix 執行緒介面,稱為 pthread,pthread create 用來建立執行緒,pthread join 等待執行緒結束,函式的原型分別如下 extern int pthread create p pthread t thread,const ...

linux 多執行緒程式設計

多執行緒的使用 典型的執行緒包括乙個執行時間系統,它可以按透明的方式來管理執行緒。通常執行緒包包括對執行緒的建立和刪除,以及對互斥和條件變數的呼叫。posix標準執行緒庫具有這些呼叫。這些包還提供執行緒的動態建立和刪除,因此,直到執行時間之前,執行緒的個數不必知道。執行緒具有乙個id 乙個堆疊 乙個...