一个线程间同步 + FIFO顺序操作链表的例子
2016-02-04 17:43
423 查看
如题:
生产者和消费者访问链表的顺序是FIFO,创建两个线程来操作这些数据:
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
struct msg {
struct msg *next;
int num;
};
struct msg *head;
struct msg *end;
struct msg *tmp;
pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void *consumer(void *p)
{
struct msg *mp;
for (;;) {
pthread_mutex_lock(&lock);
while (head == NULL)
pthread_cond_wait(&has_product, &lock);
mp = head;
head = mp->next;
pthread_mutex_unlock(&lock);
printf("Consume %d\n", mp->num);
free(mp);
sleep(rand() % 3);
}
}
void *producer(void *p)
{
struct msg *mp;
for (;;) {
mp = malloc(sizeof(struct msg));
mp->num = rand() % 1000 + 1;
printf("Produce %d\n", mp->num);
pthread_mutex_lock(&lock);
if (head == NULL)
head = mp;
else
end->next = mp;
end = mp;
end->next = NULL;
pthread_mutex_unlock(&lock);
//Queueprint();
pthread_cond_signal(&has_product);
sleep(rand() % 3);
}
}
int main(int argc, char *argv[])
{
pthread_t pid, cid;
srand(time(NULL));
pthread_create(&pid, NULL, producer, NULL);
pthread_create(&cid, NULL, consumer, NULL);
pthread_join(pid, NULL);
pthread_join(cid, NULL);
return 0;
}
输出:
$ gcc test.c -o test
$ ./test
Produce 934
Consume 934
Produce 263
Produce 701
Consume 263
Produce 753
Consume 701
Produce 257
Produce 712
Consume 753
Produce 844
Consume 257
Consume 712
Consume 844
生产者和消费者访问链表的顺序是FIFO,创建两个线程来操作这些数据:
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
struct msg {
struct msg *next;
int num;
};
struct msg *head;
struct msg *end;
struct msg *tmp;
pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void *consumer(void *p)
{
struct msg *mp;
for (;;) {
pthread_mutex_lock(&lock);
while (head == NULL)
pthread_cond_wait(&has_product, &lock);
mp = head;
head = mp->next;
pthread_mutex_unlock(&lock);
printf("Consume %d\n", mp->num);
free(mp);
sleep(rand() % 3);
}
}
void *producer(void *p)
{
struct msg *mp;
for (;;) {
mp = malloc(sizeof(struct msg));
mp->num = rand() % 1000 + 1;
printf("Produce %d\n", mp->num);
pthread_mutex_lock(&lock);
if (head == NULL)
head = mp;
else
end->next = mp;
end = mp;
end->next = NULL;
pthread_mutex_unlock(&lock);
//Queueprint();
pthread_cond_signal(&has_product);
sleep(rand() % 3);
}
}
int main(int argc, char *argv[])
{
pthread_t pid, cid;
srand(time(NULL));
pthread_create(&pid, NULL, producer, NULL);
pthread_create(&cid, NULL, consumer, NULL);
pthread_join(pid, NULL);
pthread_join(cid, NULL);
return 0;
}
输出:
$ gcc test.c -o test
$ ./test
Produce 934
Consume 934
Produce 263
Produce 701
Consume 263
Produce 753
Consume 701
Produce 257
Produce 712
Consume 753
Produce 844
Consume 257
Consume 712
Consume 844
相关文章推荐
- edittext 的 error状态
- Spring学习10-SpringMV核心组件2及SpringMVC项目示例
- dbca删除数据库失败
- EDIT 控件
- ado.net
- Spring学习10-SpringMVC原理及核心组件1
- optimize table的一个小问题
- 详解java类的生命周期
- mapreduce的resourcemanager,applicationMaster介绍
- yii 知识点
- sql server 基本操作一
- Spring学习10-SpringMVC入门
- Spring学习9-MyEclipse中Spring工程使用@Resource注释的问题
- 安卓中的上下文操作模式ActionMode:email列表多选中用到的
- Chkdsk scan needed on volume
- Spring学习8-用MyEclipse搭建SSH框架 Struts Spring Hibernate
- python 逆波兰式
- 我的android项目架构
- C++将二叉树转为双向链表及判断两个链表是否相交
- 短信设备常用AT指令集