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

教程发布:风哥 教程分类:ITPUX技术网 更新日期:2022-02-12 浏览学习:156

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

[font=Tahoma, Helvetica, SimSun, sans-serif]#define NUM 8 //---线程创建个数

[font=Tahoma, Helvetica, SimSun, sans-serif]sem_t sem_main[NUM]; //--主线程对应的(创建线程)信号量
[font=Tahoma, Helvetica, SimSun, sans-serif]sem_t sem_thr[NUM]; //--每个创建线程对应的信号量

[font=Tahoma, Helvetica, SimSun, sans-serif]void sem_test_init()
[font=Tahoma, Helvetica, SimSun, sans-serif]{
[font=Tahoma, Helvetica, SimSun, sans-serif] int i = 0;
[font=Tahoma, Helvetica, SimSun, sans-serif]
[font=Tahoma, Helvetica, SimSun, sans-serif] //主线程对应的(创建线程)信号量 初始化为1
[font=Tahoma, Helvetica, SimSun, sans-serif] for(i = 0; i < NUM; i++) [font=Tahoma, Helvetica, SimSun, sans-serif] { [font=Tahoma, Helvetica, SimSun, sans-serif] sem_init(&sem_main[i], 0, 1); [font=Tahoma, Helvetica, SimSun, sans-serif] } [font=Tahoma, Helvetica, SimSun, sans-serif] //--每个创建线程对应的信号量 初始化为0 [font=Tahoma, Helvetica, SimSun, sans-serif] for(i = 0; i < NUM; i++) [font=Tahoma, Helvetica, SimSun, sans-serif] { [font=Tahoma, Helvetica, SimSun, sans-serif] sem_init(&sem_thr[i], 0, 0); [font=Tahoma, Helvetica, SimSun, sans-serif] } [font=Tahoma, Helvetica, SimSun, sans-serif]} [font=Tahoma, Helvetica, SimSun, sans-serif]void *thr_fun(void *argv) [font=Tahoma, Helvetica, SimSun, sans-serif]{ [font=Tahoma, Helvetica, SimSun, sans-serif] int num = (int)argv; [font=Tahoma, Helvetica, SimSun, sans-serif] printf("num=%d\n", num); [font=Tahoma, Helvetica, SimSun, sans-serif] int thr_flag = 1; [font=Tahoma, Helvetica, SimSun, sans-serif] int times = 0; [font=Tahoma, Helvetica, SimSun, sans-serif] int i = 0; [font=Tahoma, Helvetica, SimSun, sans-serif] while(thr_flag) [font=Tahoma, Helvetica, SimSun, sans-serif] { [font=Tahoma, Helvetica, SimSun, sans-serif] sem_wait(&sem_thr[num]); [font=Tahoma, Helvetica, SimSun, sans-serif] for(i = 0; i < 7; i++) [font=Tahoma, Helvetica, SimSun, sans-serif] printf("thr OK\n"); [font=Tahoma, Helvetica, SimSun, sans-serif] //sleep(1); [font=Tahoma, Helvetica, SimSun, sans-serif] sem_post(&sem_main[num]); [font=Tahoma, Helvetica, SimSun, sans-serif] times++; [font=Tahoma, Helvetica, SimSun, sans-serif] if(times == 3) //退出无限循环 [font=Tahoma, Helvetica, SimSun, sans-serif] { [font=Tahoma, Helvetica, SimSun, sans-serif] //sleep(1); [font=Tahoma, Helvetica, SimSun, sans-serif] //thr_flag = 0; [font=Tahoma, Helvetica, SimSun, sans-serif] } [font=Tahoma, Helvetica, SimSun, sans-serif] } [font=Tahoma, Helvetica, SimSun, sans-serif] usleep(100); [font=Tahoma, Helvetica, SimSun, sans-serif]} [font=Tahoma, Helvetica, SimSun, sans-serif]int main(int argc, char *argv[]) [font=Tahoma, Helvetica, SimSun, sans-serif]{ [font=Tahoma, Helvetica, SimSun, sans-serif] int irs_flag = 1; [font=Tahoma, Helvetica, SimSun, sans-serif] int main_flag = 0; [font=Tahoma, Helvetica, SimSun, sans-serif] int i = 0; [font=Tahoma, Helvetica, SimSun, sans-serif] pthread_t tid[NUM]; [font=Tahoma, Helvetica, SimSun, sans-serif] int j = 0; [font=Tahoma, Helvetica, SimSun, sans-serif] sem_test_init(); [font=Tahoma, Helvetica, SimSun, sans-serif] for(j = 0; j < NUM; j++) [font=Tahoma, Helvetica, SimSun, sans-serif] { [font=Tahoma, Helvetica, SimSun, sans-serif] pthread_create(&tid[j], NULL, thr_fun, (void *)j); [font=Tahoma, Helvetica, SimSun, sans-serif] printf("***************j=%d\n", j); [font=Tahoma, Helvetica, SimSun, sans-serif] } [font=Tahoma, Helvetica, SimSun, sans-serif] //sleep(1); [font=Tahoma, Helvetica, SimSun, sans-serif] while(irs_flag) [font=Tahoma, Helvetica, SimSun, sans-serif] { [font=Tahoma, Helvetica, SimSun, sans-serif] for(i = 0; i < NUM; i++) [font=Tahoma, Helvetica, SimSun, sans-serif] { [font=Tahoma, Helvetica, SimSun, sans-serif] sem_wait(&sem_main[i]); [font=Tahoma, Helvetica, SimSun, sans-serif] } [font=Tahoma, Helvetica, SimSun, sans-serif] printf("sem_main %d times sem_wait OK\n", main_flag); [font=Tahoma, Helvetica, SimSun, sans-serif] printf("sem_thr %d times sem_post start\n", main_flag); [font=Tahoma, Helvetica, SimSun, sans-serif] for(i = 0; i < NUM; i++) [font=Tahoma, Helvetica, SimSun, sans-serif] { [font=Tahoma, Helvetica, SimSun, sans-serif] sem_post(&sem_thr[i]); [font=Tahoma, Helvetica, SimSun, sans-serif] } [font=Tahoma, Helvetica, SimSun, sans-serif] main_flag++; [font=Tahoma, Helvetica, SimSun, sans-serif] if(main_flag == 3) //退出无限循环 [font=Tahoma, Helvetica, SimSun, sans-serif] { [font=Tahoma, Helvetica, SimSun, sans-serif] //sleep(1); [font=Tahoma, Helvetica, SimSun, sans-serif] //irs_flag = 0; [font=Tahoma, Helvetica, SimSun, sans-serif] } [font=Tahoma, Helvetica, SimSun, sans-serif] } [font=Tahoma, Helvetica, SimSun, sans-serif] usleep(200); [font=Tahoma, Helvetica, SimSun, sans-serif] printf("ININININININ\n"); [font=Tahoma, Helvetica, SimSun, sans-serif] //等待线程退出 [font=Tahoma, Helvetica, SimSun, sans-serif] for(i = 0; i < NUM; i++) [font=Tahoma, Helvetica, SimSun, sans-serif] { [font=Tahoma, Helvetica, SimSun, sans-serif] pthread_join(tid[i], NULL); [font=Tahoma, Helvetica, SimSun, sans-serif] printf("OUTOUTOUTOUT\n"); [font=Tahoma, Helvetica, SimSun, sans-serif] } [font=Tahoma, Helvetica, SimSun, sans-serif] // printf("OUTOUTOUTOUT\n"); [font=Tahoma, Helvetica, SimSun, sans-serif] //销毁相应信号量 [font=Tahoma, Helvetica, SimSun, sans-serif] for(i = 0; i < NUM; i++) [font=Tahoma, Helvetica, SimSun, sans-serif] { [font=Tahoma, Helvetica, SimSun, sans-serif] sem_destroy(&sem_main[i]); [font=Tahoma, Helvetica, SimSun, sans-serif] sem_destroy(&sem_thr[i]); [font=Tahoma, Helvetica, SimSun, sans-serif] } [font=Tahoma, Helvetica, SimSun, sans-serif] printf("VVVVVVVVVVVVVV\n"); [font=Tahoma, Helvetica, SimSun, sans-serif]}

本文标签:
网站声明:本文由风哥整理发布,转载请保留此段声明,本站所有内容将不对其使用后果做任何承诺,请读者谨慎使用!
【上一篇】
【下一篇】