注意:消息是由主线程产生的,而消息这时候在堆中,两个线程通过全局变量获取访问消息。
#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);
free(mp);
}
}
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");
struct msg* mp = malloc(sizeof(struct msg));
mp->m_next = NULL;
mp->data = 110;
enqueue_msg(mp);
//sleep(5);
sleep(1);
pthread_cancel(tid1);
pthread_cancel(tid2);
//pthread_cancel(tid1);
//pthread_cancel(tid2);
printf("ok\n");
}
分享到:
相关推荐
vc++ 多线程教程---线程通信--利用事件对象,线程同步--使用信号量,线程同步--使用互斥量,线程同步--使用临界区
介绍了linux线程同步的所有方式,包括互斥、自旋、信号量、条件变量等技术
pthread 条件变量,线程同步
linux下的线程控制-互斥锁与条件变量知识.pdf
linux下的线程控制-互斥锁与条件变量[文].pdf
[经典]linux线程编程-线程间通信(1).
L16-多线程和线程同步-讲义.pdf
Java小程序:解决线程同步--生产者消费者问题,直观简单,容易理解,希望对初学者有帮助。
Linux线程管理-线程信号量的使用实例.pdf 学习资料 复习资料 教学资源
【练习】:修改该程序,使用mutex互斥锁进行同步。 1. 定义全局互斥量,初始化init(&m, NULL)互斥量,添加对应的destry 2. 两个线程while中,两次printf前后,分别加lock和unlock 3. 将unlock挪至第二个...
进程与线程--里面都是一些小例子,非常易懂
linux下的多线程实例--生产者消费者 linux下的多线程实例--生产者消费者
在多线程程序中,线程同步...Linux提供了多种线程同步机制,包括互斥锁(Mutexes)、条件变量(Condition Variables)、读写锁(Read-Write Locks)等。这些同步机制可以帮助开发者在多线程环境下实现线程安全的代码。
Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 ...Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:大总结
详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 ...Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:大总结
属原创! p1->( ( p2->(p4->p6, p5), p3->p5->p6 ) 线程同步
条件变量是线程可用的另一种同步机制。条件变量给多个线程提供了一个会合的场所。条件本身是由互斥量保护的。线程在改变 条件状态前必须首先锁住互斥量。 条件变量的初始化 pthread_cond_init 去除初始化 ...
Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 ...Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:大总结