首页 > 其他分享 >多线程+信号量同步线程

多线程+信号量同步线程

时间:2023-12-18 10:56:25浏览次数:30  
标签:__ pFunc void 信号量 线程 pthread sem 多线程 SEM

实现场景: 多线程 + 信号量实现线程同步执行

线程在创建的时候并不能保证优先顺序,是异步的,如果想按照自己指定的顺序先后执行的话,可以使用一些互斥或者同步的方式; 以下我是通过信号量来实现同步:

信号量的类型是sem_t, 需要的头文件是 #include <semaphore.h>, 主要是方法是sem_init(), sem_wait(), sem_post(), sem_destroy(), 主要的原理是通过原子计数的方式实现同步, 测试代码如下:

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <errno.h>

/**
*       实现场景: 多线程 + 线程同步执行
*/

// 信号量
sem_t   SEM_A_B;
sem_t   SEM_B_C;
sem_t   SEM_C_A;

// 函数指针
typedef void *fFunc(void *arg);

void *funcA(void *arg)
{
    (void)arg;
    pthread_detach(pthread_self());

    sem_wait(&SEM_C_A);
    sem_post(&SEM_A_B);

    printf("run func: %s | line: %d\n", __FUNCTION__, __LINE__);

    while (1)
    {
    }
    return NULL;
}

void *funcB(void *arg)

{
    (void)arg;
    pthread_detach(pthread_self());

    sem_wait(&SEM_A_B);
    sem_post(&SEM_B_C);     // 信号量+1

    printf("func: %s | line: %d\n", __FUNCTION__, __LINE__);
    while (1)
    {
    }
    return NULL;
}

void *funcC(void *arg)
{
    (void)arg;
    pthread_detach(pthread_self());

    sem_wait(&SEM_B_C);     // 信号量-1,为0接触阻塞, 大于0程序往下执行
    sem_post(&SEM_C_A);

    printf("func: %s | line: %d\n", __FUNCTION__, __LINE__);
    while (1)
    {
    }
    return NULL;
}


int main(void)
{
    // 初始化信号量
    sem_init(&SEM_A_B, 0, 0);
    sem_init(&SEM_B_C, 0, 0);
    sem_init(&SEM_C_A, 0, 1);       // 初始化信号量的值为1,表示表示该可以进行自减一操作,直接跳过阻塞

    // 初始化函数指针
    fFunc *pFunc;

    pthread_t Thread_A;
    pthread_t Thread_B;
    pthread_t Thread_C;

    pFunc = funcA;
    printf("pFunc: %p\n", pFunc);
    if ( 0 != pthread_create(&Thread_A, NULL ,pFunc, NULL) )
    {
        printf("error: %s\n", strerror(errno));
    }

    pFunc = funcB;
    printf("pFunc: %p\n", pFunc);
    if ( 0 != pthread_create(&Thread_B, NULL ,pFunc, NULL) )
    {
        printf("error: %s\n", strerror(errno));
    }

    pFunc = funcC;
    printf("pFunc: %p\n", pFunc);
    if ( 0 != pthread_create(&Thread_C, NULL ,pFunc, NULL) )
    {
        printf("error: %s\n", strerror(errno));
    }

    pthread_join(Thread_A, NULL);
    pthread_join(Thread_B, NULL);
    pthread_join(Thread_C, NULL);

    sem_destroy(&SEM_A_B);
    sem_destroy(&SEM_B_C);
    sem_destroy(&SEM_C_A);
    return 0;
}

 


标签:__,pFunc,void,信号量,线程,pthread,sem,多线程,SEM
From: https://www.cnblogs.com/weijian168/p/17910543.html

相关文章

  • 变量的线程安全分析(一)
    成员变量和静态变量是否线程安全?如果它们没有共享,则线程安全如果它们被共享了,根据它们的状态是否能够改变,又分两种情况如果只有读操作,则线程安全如果有读写操作,则这段代码是临界区,需要考虑线程安全局部变量是否线程安全?局部变量是线程安全的但局部变量引用的对象则未必如果......
  • C#:多线程篇
    文章目录基础概念进程线程句柄多线程同步/异步C#中的多线程Thread如何开启新线程线程的停止等待后台线程,前台线程跨线程操作主线程UI线程的优先级扩展封装数据槽内存栅栏资源竞争与线程锁ThreadPoolThreadPool好处线程池如何分配一个线程线程等待线程池如......
  • 信号量
    信号量信号量是什么信号量是一种用于控制对共享资源的访问的同步机制,他可以限制同时访问共享资源的线程数量,从而避免资源的竞争和冲突。使用场景:用于多线程的并发控制,类似于限流。信号量和限流的异同信号量和限流的使用场景侧重点不同:信号量通常用于控制对共享资源的访问;......
  • synchronized 经典问题之“线程八锁”
    synchronize简介一、单个对象的同步。每个方法可以同步到不同的对象,对象之间是相互独立的。privateObjectsynObject1=newObject();privateObjectsynObject2=newObject();}publicvoidf1(){synchronized(synObject1){//TODO......
  • Java 中变量的线程安全问题
    Java中的变量主要分为静态变量、普通成员变量、局部变量等,这些变量在单线程环境下是不会有线程安全问题的,但是多线程环境下实际情况又是什么样子的呢?1、成员变量和静态变量如果成员变量和静态变量不存在多个线程共享操作,那么不会有线程安全问题如果成员变量和静态变量被......
  • 线程组内几个配置原件的说明
    一、http信息头管理器1、设置请求接口提交参数的格式,一般接口的开发文档文档会有相应的说明,类型会有application,x-www-form-urlencoded等,application是提交的参数以json的格式发送,x-www-form-urlencoded是以浏览器默认表达的方式提交,根据接口说明文档设置即可二、http请求默认......
  • 信号量、事件组、任务通知:异同及替代应用分析(超细)
    在实时嵌入式系统中,信号量、事件组和任务通知是常用的同步与通信机制,它们在不同场景下有着各自的优势与适用性。本文将深入探讨这三种机制的异同,分析它们的特点及何时可以相互替代,并通过详细的代码演示展示它们的具体应用。1.信号量(Semaphore)1.1特点计数型:信号量是一种计数型的......
  • SpringBoot使用Async注解实现异步线程
    1、启动类增加@EnableAsync注解2、yml增加配置spring:task:execution:pool:max-size:8core-size:8keep-alive:60queue-capacity:1000thread-name-prefix:Asnyc-task-calc-3、编写配置类AsyncTaskConfigimp......
  • Python多线程编程:竞争问题的解析与应对策略
    本文将深入探讨Python多线程编程中可能出现的竞争问题、问题根源以及解决策略,旨在帮助读者更好地理解、应对并发编程中的挑战。多线程竞争问题的复杂性源自于对共享资源的并发访问和操作。在不同线程间的交叉执行中,共享资源可能因无序访问而导致数据不一致、死锁或饥饿等问题。解决......
  • Java核心知识体系8:Java如何保证线程安全性
    Java核心知识体系1:泛型机制详解Java核心知识体系2:注解机制详解Java核心知识体系3:异常机制详解Java核心知识体系4:AOP原理和切面应用Java核心知识体系5:反射机制详解Java核心知识体系6:集合框架详解Java核心知识体系7:线程不安全分析1Java内存模型(JMM)如何解决并发问题维度1:使......