首页 > 其他分享 >关于条件变量(C语言)

关于条件变量(C语言)

时间:2023-08-16 14:46:31浏览次数:36  
标签:变量 cond C语言 互斥 线程 关于 pthread mutex

由于条件变量必须和互斥锁协同使用,所以在介绍条件前会先介绍一下互斥锁(本文目前只介绍C语言,C++的条件变量可能后期会介绍)

  1、互斥锁

  从本质上来说,互斥锁是一把锁,保护共享资源免受并发影响的问题,同一时间只能有一个线程可以访问被保护的资源,从而防止竞态而产生不好的结果

    1、C语言互斥锁的基本使用

    pthread_mutex_init:初始化

    pthread_mutex_lock:上锁

    pthread_mutex_trylock:如果mutex已经被其他线程上锁,该操作会一直阻塞在这个地方,如果不想一直阻塞在这个地方,trylock若此时互斥量没有被上锁,函数会返回0,并对该互斥量进行上锁,如果被上锁了,就立刻返回ebusy

    pthread_mutex_unlock:解锁

  2、条件变量

    1、引入的原因

    互斥锁存在的问题:明显的缺点就是它只有锁定和非锁定两种状态,多个线程同时访问一个共享资源,并不知道合适应该使用共享资源,在临界区增加判断语句,效率不高且难实现,而条件变量能在条件成立时触发相应的线程,进行变量的修改和访问

    条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,常和互斥锁一起使用

    2、基本函数

    pthread_cond_init:创建

    pthread_cond_singal:激活一个等待等待该条件的线程

    pthread_cond_broadcast:激活所有等待的线程

    pthread_cond_wait:等待

    pthread_cond_timewait:在限定的时间内等待

    pthread_cond_destory:销毁

相关示例

#include<stdio.h>
#include<unistd.h>
#include<pthread.h>

pthread_mutex_t mutex;
pthread_cond_t isthree;

int i = 1;

void* thread1(void* arg)
{
    for (i = 1; i <= 9; i++)
    {
        pthread_mutex_lock(&mutex);
        if (i % 3 == 0)
        {
            pthread_cond_signal(&isthree);
        }
        else
        {
            printf("this is thread1 i is: %d\n", i);
        }
        pthread_mutex_unlock(&mutex);
        sleep(1);
    }
}

void* thread2(void* arg)
{
	printf("aaaa\n"); 
    while (i <= 9)
    {
        pthread_mutex_lock(&mutex);
        if (i % 3 != 0)
        {
            pthread_cond_wait(&isthree, &mutex);
            printf("this is thread2 i is: %d\n", i);
        }
        pthread_mutex_unlock(&mutex);
        sleep(1);
    }
}

int main()
{
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&isthree, NULL);

    pthread_t t1;
    pthread_t t2;

    pthread_create(&t1, NULL, thread1, NULL);
    pthread_create(&t2, NULL, thread2, NULL);

    pthread_join(t2, NULL);

    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&isthree);

    return 0;

}

  

标签:变量,cond,C语言,互斥,线程,关于,pthread,mutex
From: https://www.cnblogs.com/gunancheng/p/17633894.html

相关文章

  • python编程从入门到实践(第2版)学习笔记(变量,字符串)
    变量变量是一种可以赋给值的标签。每一个变量都指向一个相关联的值,下列代码中message即为变量,指向的值为“HelloPythonworld!”message="HelloPythonworld!"print(message)第二行的print()函数用于打印输出这个message变量所关联的值。且变量的值是可以修改的,p......
  • 关于安防视频汇聚平台EasyCVR视频平台的分析以及应用用途
    为了保证对园区环境风险进行有效识别,传统视频监控存在视频结构化利用率低的问题,在实际使用过程中,安全管理人员工作效率低下,依靠人工肉眼查看灵活度低,风险漏报概率高,出现异常情况跟踪不及时,难以解决核心问题,提供了园区AI智能视频系统,实现该园区的安全监管从传统排查向实时检测的转......
  • 笔记整理--C语言——忽略大小写的字符串查找
    char*stristr(char*pString,char*pFind){unsignedlongpFind_len=0;unsignedlongcmp_len=0;char*pt1=NULL,*pt2=NULL;char*pString_pt=pString;///////////////pFind_len=strlen(pFind);if(pFind_len==0){......
  • 关于 SAP ABAP 锁机制的一些疑问和解答
    Locktable的位置LockTable位于EnqueueServer的主内存(共享内存)中。如果enqueue服务器作为enqueue工作进程安装,则该实例的所有工作进程都可以访问锁表。外部应用服务器在enqueue服务器上的入队过程中执行其锁定操作。二者的通信,通过相关调度程序(dispatcher)和消息......
  • 关于CH32V系列MCU FLASH地址的分配
    在MRS开发环境下,针对CH32V系列MCUFLASH分配,具体方法如下:比如开辟一段空间,存放数组等数据,首先在ld文件中修改FLASH分配,如下图: .consumer_flash1:{.=ALIGN(4);}AT>FLASH1.consumer_flash2:{.=ALIGN(4);}AT>FLASH2 ......
  • 关于CH32系列MCU SDI虚拟串口功能的使用
    该功能需要配合EVT对应例程以及对应WCH-LinkUtility工具使用,WCH-LinkUtility下载链接如下:https://www.wch.cn/downloads/WCH-LinkUtility_ZIP.html该功能目前仅支持以下型号MCU,如下图,且需要配合WCH-LinkE使用,具体可见WCH-Link使用说明5.2.11小节,WCH-Link使用说明下载链接如下:ht......
  • 《安富莱嵌入式周报》第320期:键盘敲击声解码, 军工级boot设计,开源CNC运动控制器,C语言
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版:https://www.bilibili.com/video/BV1Cr4y1d7Mp/1、键盘敲击声解码https://arxiv.org/abs/2308.01074键盘敲击声被解码的话,我们使用键盘输入密码将被方便的解码出......
  • Python教程(9)——Python变量类型列表list的用法介绍
    (目录)在Python中,列表(list)是一种有序、可变的数据结构,用于存储多个元素。列表可以包含不同类型的元素,包括整数、浮点数、字符串等。实际上列表有点类似C++语言中的数组,但仅仅只是类似,和数组还是有点不一样的。列表非常适合利用顺序和位置定位某一元素,尤其是当元素的顺序或内容经常......
  • linux shell变量和数据类型
    变量是在编程中用于存储和操作数据的容器。在Shell脚本中,变量不需要事先声明数据类型,可以存储不同类型的值。以下是一些常见的变量和数据类型的示例:1.**字符串变量**:字符串是文本数据,在Shell脚本中用双引号或单引号括起来。NAME="Alice"MESSAGE='Hello,World!'2.**整数......
  • Python教程(9)——Python变量类型列表list的用法介绍
    在Python中,列表(list)是一种有序、可变的数据结构,用于存储多个元素。列表可以包含不同类型的元素,包括整数、浮点数、字符串等。实际上列表有点类似C++语言中的数组,但仅仅只是类似,和数组还是有点不一样的。列表非常适合利用顺序和位置定位某一元素,尤其是当元素的顺序或内容经常发生改......