设为首页 加入收藏

TOP

Linux系统下的多线程编程-条件变量&信号量(二)
2014-11-23 21:44:16 来源: 作者: 【 】 浏览:48
Tags:Linux 系统 线程 编程 条件 变量 信号
e MAXSTACK 100
int stack[MAXSTACK][2];
int size=0;
sem_t sem;
/* 从文件1.dat读取数据,每读一次,信号量加一*/
void ReadData1(void){
 FILE *fp=fopen("1.dat","r");
 while(!feof(fp)){
  fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]);
  sem_post(&sem);
  ++size;
 }
 fclose(fp);
}
/*从文件2.dat读取数据*/
void ReadData2(void){
 FILE *fp=fopen("2.dat","r");
 while(!feof(fp)){
  fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]);
  sem_post(&sem);
  ++size;
 }
 fclose(fp);
}
/*阻塞等待缓冲区有数据,读取数据后,释放空间,继续等待*/
void HandleData1(void){
 while(1){
  sem_wait(&sem);
  printf("Plus:%d+%d=%dn",stack[size][0],stack[size][1],
  stack[size][0]+stack[size][1]);
  --size;
 }
}


void HandleData2(void){
 while(1){
  sem_wait(&sem);
  printf("Multiply:%d*%d=%dn",stack[size][0],stack[size][1],
  stack[size][0]*stack[size][1]);
  --size;
 }
}
int main(void){
 pthread_t t1,t2,t3,t4;
 sem_init(&sem,0,0);
 pthread_create(&t1,NULL,(void *)HandleData1,NULL);
 pthread_create(&t2,NULL,(void *)HandleData2,NULL);
 pthread_create(&t3,NULL,(void *)ReadData1,NULL);
 pthread_create(&t4,NULL,(void *)ReadData2,NULL);
 /* 防止程序过早退出,让它在此无限期等待*/
 pthread_join(t1,NULL);
}


  在Linux下,我们用命令gcc -lpthread sem.c -o sem生成可执行文件sem。我们事先编辑好数据文件1.dat和2.dat,假设它们的内容分别为1 2 3 4 5 6 7 8 9 10和 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 ,我们运行sem,得到如下的结果:


Multiply:-1*-2=2
Plus:-1+-2=-3
Multiply:9*10=90
Plus:-9+-10=-19
Multiply:-7*-8=56
Plus:-5+-6=-11
Multiply:-3*-4=12
Plus:9+10=19
Plus:7+8=15
Plus:5+6=11


  从中我们可以看出各个线程间的竞争关系。而数值并未按我们原先的顺序显示出来这是由于size这个数值被各个线程任意修改的缘故。这也往往是多线程编程要注意的问题。


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇交互式Linux内核地图 下一篇在ARM-Linux平台上移植SQLite

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: