lesson5 執行緒的高階屬性

2021-07-26 22:51:50 字數 2375 閱讀 2163

1.一次性初始化:

互斥量智慧型初始化一次,再次初始化會出現錯誤。比如自己寫庫函式時將互斥量封裝進去,這時一次性初始化就用上場了。

定義變數pthread_once_t once_control = pthread_once_init;

void init_routine()

else if(pid>0)

pthread_mutexattr_destroy(&mutexattr);

pthread_mutex_destroy(mutex);

//解除對映

munmap(buf, 100);

//消除共享記憶體

shm_unlink(shm);

//解除對映

munmap(mutex, 100);

//消除共享記憶體

5.執行緒私有資料

多個函式多個程序可以訪問這個變數,看起來像全域性變數;但是它又不是全域性變數,執行緒對這個變數的訪問不會彼此產生影響。比如引數errno。

使用私有資料前,要先建立乙個與私有資料相關的key,型別pthread_key_t.

使用函式pthread_key_create建立鍵,建立的鍵放在引數key指向的記憶體單元,另乙個引數destructor是析構函式。

pthread_key_delete銷毀鍵,當鍵銷毀後與它關聯的資料並沒有被銷毀!

pthread_setspecific將私有資料與key關聯

pthread_getspecific獲取私有資料的位址

6.示例,使用私有資料

/*date:			2015-4-17

*author: wj

*description: 執行緒到私有資料, 乙個像errno一樣到資料

*/#include "apue.h"

pthread_key_t key;

void *thread_fun1(void *arg)

void *thread_fun2(void *arg)

int main()

if(pthread_create(&tid2, null, thread_fun2, null))

//等待新執行緒結束

pthread_join(tid1, null);

pthread_join(tid2, null);

pthread_key_delete(key);

return;

}

7.執行緒與fork

當執行緒fork時,為子程序建立了整個程序位址空間的副本,子程序通過繼承整個位址空間的副本,也會將父程序的互斥量、讀寫鎖、條件變數的狀態繼承過來。如果父程序中互斥量是鎖著的,那麼子程序中互斥量也是鎖著的,雖然子程序自己還沒lock。這時,子程序無法解鎖。

子程序內部只有乙個執行緒,由父程序中呼叫fork函式的執行緒副本構成。如果呼叫fork的執行緒將互斥量鎖住,那麼子程序會拷貝乙個pthread_mutex_lock副本。這時子程序就有機會解鎖。

pthread_atfork函式

引數prepare在fork呼叫前會被呼叫

引數parent在fork返回父程序前呼叫

引數child在fork返回子程序前呼叫

8.示例,執行緒與fork安全

/*date:			2015-4-17

*author: ddddd

*description: 安全的使用fork

* prepare 在呼叫fork之前會被呼叫

* parent 在fork返回父程序之前被呼叫

* child 在fork返回子程序之前被呼叫

*/#include "apue.h"

pthread_mutex_t mutex = pthread_mutex_initializer;

void prepare()

void parent()

void child()

void *thread_fun(void *arg)

if(pid>0) }

int main()

pthread_mutex_lock(&mutex);

sleep(2);

printf("main\n");

pthread_mutex_unlock(&mutex);

pthread_join(tid, null);

pthread_mutex_destroy(&mutex);

return;

}

注意:執行緒安全是gcc -pthread 編譯

執行緒非安全是gcc-lpthread編譯

Lesson 5 實時訊息迴圈

in this lesson we will cover a single function,peekmessage and how this function differs from its evil twin,getmessage 主要講的就是peekmessage 和getmessage 兩...

Lesson 5 條件控制語句

1000以內的水仙花數 水仙花數是指乙個 3 位數,它的每個位上的數字的 3次冪之和等於它本身 例如 1 3 5 3 3 3 153 先找出1000以內的所有三位數 判斷水仙花數 i 100 while i 1000 print i b str i i 1if int b 0 3 int b 1 3...

c語言 lesson 5 指標和函式

一 知識點 1 常量指標 1 int x 100 int const p1 x const 在 左邊,指向的記憶體是常量 p不可修改 p可修改 2 int const p2 x const 在 右邊,指標是常量 p 可修改 p不可修改 必須初始化 常量指標 int x 100 int y 200 c...