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...