<>线程-异步通信和同步通信

 

《异步通信》

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
//#include <sys/ipc.h>
#include <semaphore.h>

int lock_var;
time_t end_time;
sem_t sem;

void pthread1(void *arg);
void pthread2(void *arg);

int main(int argc, char *argv[])
{
 pthread_t id1,id2;
 //pthread_t mon_th_id;
 int ret;
 
 end_time = time(NULL)+30;//终止时间
 
 ret=sem_init(&sem,0,1);
 if(ret!=0)
 {
  perror("sem_init");
 }
 
 ret=pthread_create(&id1,NULL,(void *)pthread1, NULL);
 if(ret!=0)
  perror("pthread cread1");
 
 ret=pthread_create(&id2,NULL,(void *)pthread2, NULL);
 if(ret!=0)
  perror("pthread cread2");
 
 pthread_join(id1,NULL);//等待回收线程
 pthread_join(id2,NULL);

 exit(0);
}

void pthread1(void *arg)
{
 int i;
 while(time(NULL) < end_time)
 {
  sem_wait(&sem);
  
  for(i=0;i<2;i++)
  {
//新加printf("wat);
   sleep(1);
   lock_var++;
   printf("lock_var=%d\n",lock_var);
  }
  
  printf("pthread1:lock_var=%d\n",lock_var);//进行操作,也就是资源保护
  
  sem_post(&sem);//释放锁
  sleep(1);
 }
}

void pthread2(void *arg)
{
// int nolock=0;
 //int ret;
 
 while(time(NULL) < end_time)
 {
//新加 printf("pthread2:before sem_wait()\n");
  sem_wait(&sem);
  
  printf("pthread2:pthread2 got lock;lock_var=%d\n",lock_var);
  
  sem_post(&sem);
  sleep(3);//更改为1
 }
}

编译执行时候要助注意:

lsb@ubuntu:~/gx/wangluo$ gcc -g -o sem_num sem_num.c -lpthread

lsb@ubuntu:~/gx/wangluo$ ./sem_num
lock_var=1
lock_var=2
pthread1:lock_var=2
pthread2:pthread2 got lock;lock_var=2
lock_var=3
lock_var=4
pthread1:lock_var=4
pthread2:pthread2 got lock;lock_var=4
lock_var=5
lock_var=6
pthread1:lock_var=6
pthread2:pthread2 got lock;lock_var=6
lock_var=7
lock_var=8
pthread1:lock_var=8
pthread2:pthread2 got lock;lock_var=8

*****************************************************

《同步通信》


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <sys/ipc.h>
#include <semaphore.h>
int lock_var;
time_t end_time;//获取本地时间
sem_t sem1,sem2;

void pthread1(void *arg);
void pthread2(void *arg);

int main(int argc, char *argv[])
{
 pthread_t id1,id2;
 //pthread_t mon_th_id;
 int ret;
 end_time = time(NULL)+30;
######################################给线程,分配那些可执行文件###################################
 ret=sem_init(&sem1,0,1);
 ret=sem_init(&sem2,0,0);
 if(ret!=0)
 {
  perror("sem_init");
 }
 ret=pthread_create(&id1,NULL,(void *)pthread1, NULL);
 if(ret!=0)
  perror("pthread cread1");
 ret=pthread_create(&id2,NULL,(void *)pthread2, NULL);
 if(ret!=0)
  perror("pthread cread2");
 pthread_join(id1,NULL);
 pthread_join(id2,NULL);
 exit(0);
}

void pthread1(void *arg)
{
 int i;
 while(time(NULL) < end_time){
  sem_wait(&sem2);//进行2P操作
  for(i=0;i<2;i++){
   sleep(1);
   lock_var++;
   printf("lock_var=%d\n",lock_var);
  }
  printf("pthread1:lock_var=%d\n",lock_var);
  sem_post(&sem1);//通知1,进行V操作
  sleep(1);
 }
}

void pthread2(void *arg)
{
 //int nolock=0;
 //int ret;
 while(time(NULL) < end_time){
 sem_wait(&sem1);
 printf("pthread2:pthread1 got lock;lock_var=%d\n",lock_var);
 sem_post(&sem2);
 sleep(3);
 }
}

 执行:
lsb@ubuntu:~/gx/wangluo$ gcc -o sem_syn sem_syn.c -lpthread

lsb@ubuntu:~/gx/wangluo$ ./sem_syn
pthread2:pthread1 got lock;lock_var=0
lock_var=1
lock_var=2
pthread1:lock_var=2
pthread2:pthread1 got lock;lock_var=2
lock_var=3
lock_var=4
pthread1:lock_var=4
pthread2:pthread1 got lock;lock_var=4
lock_var=5
lock_var=6
pthread1:lock_var=6
pthread2:pthread1 got lock;lock_var=6
lock_var=7
lock_var=8
pthread1:lock_var=8
pthread2:pthread1 got lock;lock_var=8

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值