linux執行緒同步 條件變數練習 1

2021-09-30 14:50:17 字數 1671 閱讀 3238

注意:訊息是由主線程產生的,而訊息這時候在棧中,兩個執行緒通過全域性變數獲取訪問訊息。

unix環境高階程式設計p288

程序的所有資訊對該程序的所有執行緒都是共享的,包括可執行的程式文字、程式的全域性變數和堆記憶體、棧以及檔案描述符。

#include #include struct msg ;

struct msg *workq;

pthread_cond_t qready = pthread_cond_initializer;

pthread_mutex_t qlock = pthread_mutex_initializer;

void

process_msg(void)

} void

enqueue_msg(struct msg *mp)

void* thr_fn(void* arg)

int main()

err = pthread_create(&tid2,null,thr_fn,null);

if(err !=0)

printf("create success.\n");

sleep(1);

struct msg msg1;

msg1.data = 110;

msg1.m_next = null;

workq = null;

enqueue_msg(&msg1);

printf("add a msg\n");

sleep(3);

//pthread_cancel(tid1);

//pthread_cancel(tid2);

printf("ok\n");

}

前面的程式訪問的是主線程的棧區,下面的程式訪問的是乙個子執行緒的棧區。

可見執行緒之間是可以互相訪問棧區的。

#include #include #include struct msg ;

struct msg *workq;

pthread_cond_t qready = pthread_cond_initializer;

pthread_mutex_t qlock = pthread_mutex_initializer;

void

process_msg(void)

}void

enqueue_msg(struct msg *mp)

void* thr_fn(void* arg)

void* thr_fn2(void* arg)

}int main()

err = pthread_create(&tid2,null,thr_fn,null);

if(err !=0)

err = pthread_create(&tid3,null,thr_fn2,null);

if(err!=0)

printf("create success.\n");

//enqueue_msg(mp);

//sleep(5);

sleep(20);

pthread_cancel(tid1);

pthread_cancel(tid2);

//pthread_cancel(tid1);

//pthread_cancel(tid2);

printf("ok\n");

}

Linux執行緒同步 條件變數

執行緒間的同步還有乙個情況 程序a 需要等待乙個條件成立,才執行,當條件不成立時就阻塞等待 程序b 需要設定條件,當條件成立時,喚醒程序a.這裡我們就可以用到條件變數。條件變數變數也是出自posix執行緒標準,另一種執行緒同步機制,主要用來等待某個條件的發生,然後進行相應的操作,這樣可以消除多執行緒...

Linux 執行緒同步 條件變數

pthread cond signal 使在條件變數上等待的執行緒中的乙個執行緒重新開始。如果沒有等待的執行緒,則什麼也不做。如果有多個執行緒在等待該條件,只有乙個能重啟動,但不能指定哪乙個。pthread cond broadcast 重啟動等待該條件變數的所有執行緒。如果沒有等待的執行緒,則什麼...

Linux執行緒同步之條件變數

與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙...