注意:訊息是由主線程產生的,而訊息這時候在棧中,兩個執行緒通過全域性變數獲取訪問訊息。
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執行緒同步之條件變數
與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙...