二进制信号量 linux,二进制信号量在多线程间实现同步模型

在多线程同步开发中,为了实现执行线程在条件未到达时等待条件到达,进而用忙等待实现等待,这样大大浪费了CPU资源且CPU占用很大,导致服务器系统整体性能下降。为了解决CPU占用大的问题,用信号量替代忙等待条件,实现执行线程在条件未到达时用阻塞等待条件到达。下面是用二进制信号量实现多线程间同步简单设计模型。

#include

#include

#include

#include

#define NUM  8 //---线程创建个数

sem_t sem_main[NUM]; //--主线程对应的(创建线程)信号量

sem_t sem_thr[NUM];  //--每个创建线程对应的信号量

void sem_test_init()

{

int i = 0;

//主线程对应的(创建线程)信号量 初始化为1

for(i = 0; i < NUM; i++)

{

sem_init(&sem_main[i], 0, 1);

}

//--每个创建线程对应的信号量 初始化为0

for(i = 0; i < NUM; i++)

{

sem_init(&sem_thr[i], 0, 0);

}

}

void *thr_fun(void *argv)

{

int num = (int)argv;

printf("num=%d\n", num);

int thr_flag = 1;

int times = 0;

int i = 0;

while(thr_flag)

{

sem_wait(&sem_thr[num]);

for(i = 0; i < 7; i++)

printf("thr OK\n");

//sleep(1);

sem_post(&sem_main[num]);

times++;

if(times == 3)  //退出无限循环

{

//sleep(1);

//thr_flag = 0;

}

}

usleep(100);

}

int main(int argc, char *argv[])

{

int irs_flag = 1;

int main_flag = 0;

int i = 0;

pthread_t  tid[NUM];

int j = 0;

sem_test_init();

for(j = 0; j < NUM; j++)

{

pthread_create(&tid[j], NULL, thr_fun, (void *)j);

printf("***************j=%d\n", j);

}

//sleep(1);

while(irs_flag)

{

for(i = 0; i < NUM; i++)

{

sem_wait(&sem_main[i]);

}

printf("sem_main %d times sem_wait OK\n", main_flag);

printf("sem_thr %d times sem_post start\n", main_flag);

for(i = 0; i < NUM; i++)

{

sem_post(&sem_thr[i]);

}

main_flag++;

if(main_flag == 3) //退出无限循环

{

//sleep(1);

//irs_flag = 0;

}

}

usleep(200);

printf("ININININININ\n");

//等待线程退出

for(i = 0; i < NUM; i++)

{

pthread_join(tid[i], NULL);

printf("OUTOUTOUTOUT\n");

}

// printf("OUTOUTOUTOUT\n");

//销毁相应信号量

for(i = 0; i < NUM; i++)

{

sem_destroy(&sem_main[i]);

sem_destroy(&sem_thr[i]);

}

printf("VVVVVVVVVVVVVV\n");

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值