线程的执行的无序性---生产消费者
2010-06-10 22:05
344 查看
源程序:
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
#include <semaphore.h>
#define BUFSIZE 4
#define NUMBER 8
int sum_of_number=0;
sem_t write_res_number;
sem_t read_res_number;
struct recycle_buffer
{
int buffer[BUFSIZE];
int head,tail;
}re_buf;
pthread_mutex_t buffer_mutex=PTHREAD_MUTEX_INITIALIZER;
void *prod(void *arg)
{
int i;
for(i=0;i<=8;i++)
{
sem_wait(&write_res_number);
pthread_mutex_lock(&buffer_mutex);
re_buf.buffer[re_buf.tail]=i;
re_buf.tail=(re_buf.tail+1)%BUFSIZE;
printf("procuder %d write %d./n",(int)pthread_self(),i);
pthread_mutex_unlock(&buffer_mutex);
sem_post(&read_res_number);
}
return NULL;
}
void *consumer(void *arg)
{
int i,num;
for(i=0;i<=8;i++)
{
sem_wait(&read_res_number);
pthread_mutex_lock(&buffer_mutex);
num=re_buf.buffer[re_buf.head];
re_buf.head=(re_buf.head+1)%BUFSIZE;
printf("consumer %d read %d./n",(int)pthread_self(),num);
pthread_mutex_unlock(&buffer_mutex);
sum_of_number+=num;
sem_post(&write_res_number);
}
return NULL;
}
int main()
{
pthread_t pid,cid;
int i;
re_buf.head=0;
re_buf.tail=0;
for(i=0;i<BUFSIZE;i++)
re_buf.buffer[i]=0;
sem_init(&write_res_number,0,BUFSIZE);
sem_init(&read_res_number,0,0);
pthread_create(&pid,NULL,prod,NULL);
pthread_create(&cid,NULL,consumer,NULL);
pthread_join(pid,NULL);
pthread_join(cid,NULL);
printf("the sum of number is %d/n",sum_of_number);
for(i=0;i<4;i++)
printf("%d/n",re_buf.buffer[i]);
return 0;
}
运行结果:
1。
procuder -1210569840 write 0.
procuder -1210569840 write 1.
consumer -1218962544 read 0.
procuder -1210569840 write 2.
consumer -1218962544 read 1.
consumer -1218962544 read 2.
procuder -1210569840 write 3.
procuder -1210569840 write 4.
procuder -1210569840 write 5.
procuder -1210569840 write 6.
consumer -1218962544 read 3.
consumer -1218962544 read 4.
consumer -1218962544 read 5.
consumer -1218962544 read 6.
procuder -1210569840 write 7.
procuder -1210569840 write 8.
consumer -1218962544 read 7.
consumer -1218962544 read 8.
the sum of number is 36
8
5
6
7
2。
procuder -1209984112
write 0.
procuder -1209984112 write 1.
procuder -1209984112 write 2.
procuder -1209984112 write 3.
consumer -1218376816 read 0.
consumer -1218376816 read 1.
consumer -1218376816 read 2.
consumer -1218376816 read 3.
procuder -1209984112 write 4.
procuder -1209984112 write 5.
procuder -1209984112 write 6.
procuder -1209984112 write 7.
consumer -1218376816 read 4.
consumer -1218376816 read 5.
consumer -1218376816 read 6.
consumer -1218376816 read 7.
procuder -1209984112 write 8.
consumer -1218376816 read 8.
the sum of number is 36
8
5
6
7
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
#include <semaphore.h>
#define BUFSIZE 4
#define NUMBER 8
int sum_of_number=0;
sem_t write_res_number;
sem_t read_res_number;
struct recycle_buffer
{
int buffer[BUFSIZE];
int head,tail;
}re_buf;
pthread_mutex_t buffer_mutex=PTHREAD_MUTEX_INITIALIZER;
void *prod(void *arg)
{
int i;
for(i=0;i<=8;i++)
{
sem_wait(&write_res_number);
pthread_mutex_lock(&buffer_mutex);
re_buf.buffer[re_buf.tail]=i;
re_buf.tail=(re_buf.tail+1)%BUFSIZE;
printf("procuder %d write %d./n",(int)pthread_self(),i);
pthread_mutex_unlock(&buffer_mutex);
sem_post(&read_res_number);
}
return NULL;
}
void *consumer(void *arg)
{
int i,num;
for(i=0;i<=8;i++)
{
sem_wait(&read_res_number);
pthread_mutex_lock(&buffer_mutex);
num=re_buf.buffer[re_buf.head];
re_buf.head=(re_buf.head+1)%BUFSIZE;
printf("consumer %d read %d./n",(int)pthread_self(),num);
pthread_mutex_unlock(&buffer_mutex);
sum_of_number+=num;
sem_post(&write_res_number);
}
return NULL;
}
int main()
{
pthread_t pid,cid;
int i;
re_buf.head=0;
re_buf.tail=0;
for(i=0;i<BUFSIZE;i++)
re_buf.buffer[i]=0;
sem_init(&write_res_number,0,BUFSIZE);
sem_init(&read_res_number,0,0);
pthread_create(&pid,NULL,prod,NULL);
pthread_create(&cid,NULL,consumer,NULL);
pthread_join(pid,NULL);
pthread_join(cid,NULL);
printf("the sum of number is %d/n",sum_of_number);
for(i=0;i<4;i++)
printf("%d/n",re_buf.buffer[i]);
return 0;
}
运行结果:
1。
procuder -1210569840 write 0.
procuder -1210569840 write 1.
consumer -1218962544 read 0.
procuder -1210569840 write 2.
consumer -1218962544 read 1.
consumer -1218962544 read 2.
procuder -1210569840 write 3.
procuder -1210569840 write 4.
procuder -1210569840 write 5.
procuder -1210569840 write 6.
consumer -1218962544 read 3.
consumer -1218962544 read 4.
consumer -1218962544 read 5.
consumer -1218962544 read 6.
procuder -1210569840 write 7.
procuder -1210569840 write 8.
consumer -1218962544 read 7.
consumer -1218962544 read 8.
the sum of number is 36
8
5
6
7
2。
procuder -1209984112
write 0.
procuder -1209984112 write 1.
procuder -1209984112 write 2.
procuder -1209984112 write 3.
consumer -1218376816 read 0.
consumer -1218376816 read 1.
consumer -1218376816 read 2.
consumer -1218376816 read 3.
procuder -1209984112 write 4.
procuder -1209984112 write 5.
procuder -1209984112 write 6.
procuder -1209984112 write 7.
consumer -1218376816 read 4.
consumer -1218376816 read 5.
consumer -1218376816 read 6.
consumer -1218376816 read 7.
procuder -1209984112 write 8.
consumer -1218376816 read 8.
the sum of number is 36
8
5
6
7
相关文章推荐
- 线程的执行的无序性---生产消费者
- 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者
- Thread线程之 多生产者与多消费者模拟生产消费
- 深度剖析java线程安全|内存模型|生产消费者模式|
- Java线程之1.4版多生产多消费者示例(三)
- 黑马程序员_JavaSE基础14 之 线程间通信 等待唤醒机制 多生产多消费者 ...
- 一个线程作为生产者,一个线程作为消费者。生产者每生产一次,消费者就消费一次。生产者每次生产一定数量的商品,加上上次消费剩余的数量,而总数量不超过1000;总感觉代码不是很完善,求指教??
- 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者
- 两个线程执行生产 * 两线程执行消费 * 依次交替循环
- Java线程机制的浅析 生产/消费者模式 LinkedBlockingQueue
- 多线程执行多任务(线程通信):生产者消费者模型(一)
- 原版线程通信之生产消费者模式
- 多线程执行多任务(线程通信):生产者消费者模型(二)
- 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者
- 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。
- 线程间的通信-生产消费者模式
- java生产者消费者模型(线程协作)
- 线程经典案例:生产和消费者
- java主线程等待所有子线程执行完毕在执行(常见面试题)
- 用Handler的post()方法来传递线程中的代码段到主线程中执行