日期:2014-05-16 浏览次数:20722 次
注意:消息是由主线程产生的,而消息这时候在栈中,两个线程通过全局变量获取访问消息。
Unix环境高级编程P288
进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本、程序的全局变量和堆内存、栈以及文件描述符。
?
#include <pthread.h> #include <stdio.h> struct msg { int data; struct msg *m_next; /* ... more stuff here ... */ }; struct msg *workq; pthread_cond_t qready = PTHREAD_COND_INITIALIZER; pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER; void process_msg(void) { struct msg *mp; for (;;) { pthread_mutex_lock(&qlock); while (workq == NULL) pthread_cond_wait(&qready, &qlock); mp = workq; workq = mp->m_next; pthread_mutex_unlock(&qlock); /* now process the message mp */ printf("deal the mp. the data is %d\n",mp->data); } } void enqueue_msg(struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp; pthread_mutex_unlock(&qlock); pthread_cond_signal(&qready); } void* thr_fn(void* arg){ process_msg(); return ((void*)1); } int main(){ pthread_t tid1; pthread_t tid2; int err; err = pthread_create(&tid1,NULL,thr_fn,NULL); if(err !=0){ err_quit("can't create thread%s\n",strerror(err)); } err = pthread_create(&tid2,NULL,thr_fn,NULL); if(err !=0){ err_quit("cant' create thread%s\n",strerror(err)); } 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 <pthread.h> #include <stdlib.h> #include <stdio.h> struct msg { int data; struct msg *m_next; /* ... more stuff here ... */ }; struct msg *workq; pthread_cond_t qready = PTHREAD_COND_INITIALIZER; pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER; void process_msg(void) { struct msg *mp; for (;;) { pthread_mutex_lock(&qlock); while (workq == NULL) pthread_cond_wait(&qready, &qlock); mp = workq; workq = mp->m_next; pthread_mutex_unlock(&qlock); /* now process the message mp */ printf("deal the mp. the data is %d\n",mp->data); } } void enqueue_msg(struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp; pthread_mutex_unlock(&qlock); pthread_cond_signal(&qready); } void* thr_fn(void* arg){ process_msg(); return ((void*)1); } void* thr_fn2(void* arg){ for(;;){ struct msg temp; temp.data =120; temp.m_next = NULL; enqueue_msg(&temp); sleep(2); } } int main(){ pthread_t tid1; pthread_t tid2; pthread_t tid3; int err; err = pthread_create(&tid1,NULL,thr_fn,NULL); if(err !=0){ err_quit("can't create thread%s\n",strerror(err)); } err = pthread_create(&tid2,NULL,thr_fn,NULL); if(err !=0){ err_quit("cant' create thread%s\n",strerror(err)); } err = pthread_create(&tid3,NULL,thr_fn2,NULL); if(err!=0){ err_quit("cant' create thread%s\n",strerror(err)); } 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"); }?
?