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

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

#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");

}

时间: 2024-08-27 13:02:32

二进制信号量在多线程间实现同步模型的相关文章

有名信号量在多线程间的同步

/*semopen_pth.c*/#include <stdio.h>#include <semaphore.h>#include <fcntl.h>#include <pthread.h>#include<stdlib.h>void print();void * thread_function(void *arg);sem_t * sem; int main(int argc,char * argv[]) { int n=0,i=0; pthr

无名信号量在多线程间的同步

//无名信号量的常见用法是将要保护的变量放在sem_wait和sem_post中间所形成的临界区内,这样该变量就会被//保护起来,例如:#include <pthread.h>#include <semaphore.h>#include <sys/types.h>#include <stdio.h>#include <unistd.h>int number; // 被保护的全局变量sem_t sem_id;void* thread_one_fun

第七十四课、多线程间的同步

一.多线程间的同步 1.多线程编程的本质 (1).并发性是多线程编程的本质 (2).在宏观上,所有线程并行执行 (3).多个线程间相互独立,互不干涉 2.特殊情况下,多线程存在依赖 煮菜和煮饭这两个线程结束后,才能进行吃饭的线程 3.同步的概念 (1).在特殊情况下,控制多线程间的相对执行顺序 (2).QThread类支持线程间的同步 #include <QCoreApplication> #include <QThread> #include <QDebug> /*

C#多线程间的同步问题

使用线程时最头痛的就是共享资源的同步问题,处理不好会得到错误的结果,C#处理共享资源有以下几种: 1.lock锁 2.Mutex类 3.semaphore 其中lock 和mutex 差不多,都是锁定同一个资源,不同之处mutex在整个进程中都可以访问到. semaphore是锁定多个资源,比如同一时期只能有两个线程访问,其它线程只能等待其中之一释放锁才能使用,Semaphore就是一个可以多次进入的“Mutex”.Mutex永远只允许一个线程拥有它,而Semaphore可以允许多个线程请求,因

vc++高级班之多线程篇[6]---线程间的同步机制①

①.线程同步的必要性: int g_Num = 0; UINT __cdecl ThreadProc(LPVOID lpParameter) { for (int idx = 0; idx < 100; ++idx) { g_Num = g_Num+1; CString strNum; strNum.Format(_T("%d"), g_Num); g_Num = g_Num-1; } return 0; } void CThreadTestDlg::OnBnClickedBtn

C# 多线程之线程同步

多线程间应尽量避免同步问题,最好不要线程间共享数据.如果必须要共享数据,就需要使用同步技术,确保一次只有一个线程访问和改变共享状态. 一::lock语句 lock语句事设置锁定和接触锁定的一种简单方法.其语法非常简单: lock (obj) { // 需要发生同步的代码区 } 将共享数据的操作代码,放在上述的"{...}"区域内.锁定的对象(obj)必须是引用类型,如果锁定一个值类型,实际是锁定了它的一个副本,并没有实现锁定功能. 一般地,被锁定对象需要被创建为 私有 只读 引用类型:

线程同步与互斥(POSIX信号量——环形数组实现生产者消费者模型)

Semaphore(信号量) Mutex变量是非0即1的,可看作一种资源的可用数量,初始化时Mutex是1,表示有一个可用资源,加锁时获得该资源,将Mutex减到0,表示不再有可用资源,解锁时释放该资源,将Mutex重新加到1,表示又有了一个可用资源. 信号量(Semaphore)和Mutex类似,表示可用资源的数量,和Mutex不同的是这个数量可以大于1.如果信号量描述的资源数目是1时,此时的信号量和互斥锁相同! POSIX semaphore库函数,这种信号量不仅可用于同一进程的线程间同步,

一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与相互排斥一)

各位看官们.大家好,上一回中咱们说的是进程间同步与相互排斥的样例,这一回咱们说的样例是:使用信号量进行进程间同步与相互排斥. 闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,信号量是由著名计算机科学家迪杰斯特拉(Dijkstra)提出的一种概念,专门用来解决进程间同步与相互排斥.在他提出的概念中信号量是一个非负整数值. 信号量的操作仅仅能有两种原子操作: 等待信号; 发送信号. "什么是原子操作呢?"台下有看官在提问.原子操作就是指某个动作在运行时不能被其他动作中断,它会一

linux信号量之进程间同步

概念 linux信号量:允许多个线程同时进入临界区,可以用于进程间的同步. 和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区. 所在头文件:semaphore.h 主要函数 初始化函数 int sem_init(sem_t *sem, int pshared, unsigned int value) sem:要初始化的信号量 pshared:此信号量是在进程间共享还是线程间共享 value:信号量的初始值 删除函数 int sem_destroy(sem_t *sem) sem:要销