IMX6:pthread_cond_t条件变量测试

news2024/11/16 17:58:53

简介 

pthread_cond_t是一个条件变量的数据类型,用于线程间的同步和通信。它通常与互斥锁(pthread_mutex_t)一起使用,以实现线程的等待和唤醒操作。

以下是两个与pthread_cond_t相关的函数的介绍:

  1. pthread_cond_init:用于初始化条件变量。它接受两个参数,第一个参数是指向条件变量的指针,第二个参数是指向条件变量属性的指针。如果不需要特殊属性,可以将第二个参数设置为NULL。该函数在成功时返回0,否则返回错误代码。

  2. pthread_cond_destroy:用于销毁条件变量。它接受一个参数,即指向条件变量的指针。该函数在成功时返回0,否则返回错误代码。

条件变量相关函数

int pthread_cond_init(pthread_cond_t *cv, const pthread_condattr_t *a);

int pthread_cond_destroy(pthread_cond_t *cv);

int pthread_cond_signal (pthread_cond_t *cv);

int pthread_cond_broadcast (pthread_cond_t *cv);

int pthread_cond_wait (pthread_cond_t *cv, pthread_mutex_t *external_mutex);

int pthread_cond_timedwait(pthread_cond_t *cv, pthread_mutex_t *external_mutex, const struct timespec *t);

int pthread_cond_timedwait_relative_np(pthread_cond_t *cv, pthread_mutex_t *external_mutex, const struct timespec *t);

互斥锁相关函数 

int pthread_mutex_lock(pthread_mutex_t *m);

int pthread_mutex_timedlock(pthread_mutex_t *m, const struct timespec *ts);

int pthread_mutex_unlock(pthread_mutex_t *m);

int pthread_mutex_trylock(pthread_mutex_t *m);

int pthread_mutex_init(pthread_mutex_t *m, const pthread_mutexattr_t *a);

int pthread_mutex_destroy(pthread_mutex_t *m); 

测试源码:

#include <sys/epoll.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

struct my_struct {
    pthread_cond_t cond;
    pthread_mutex_t mutex;
    int run;
};

void * my_func1(void * arg){
    struct my_struct *p = (struct my_struct *)arg;
    pthread_mutex_lock(&p->mutex);
    DEBUG_INFO("Main thread waking up the other thread...\n");
    pthread_cond_signal(&p->cond);
    DEBUG_INFO("I want to sleep");
    sleep(1);
    DEBUG_INFO("Are you waiting me?Yes,You must wait");
    pthread_mutex_unlock(&p->mutex);
    DEBUG_INFO("task 1 exit");
    return NULL;
}

void * my_func2(void * arg){
    struct my_struct *p = (struct my_struct *)arg;
    pthread_mutex_lock(&p->mutex);
    DEBUG_INFO("Thread waiting...\n");
    pthread_cond_wait(&p->cond, &p->mutex);
    DEBUG_INFO("Thread woken up!\n");
    pthread_mutex_unlock(&p->mutex);
    p->run = 0;
    return NULL;
}

int main(int argc, char *argv[]){
    pthread_t p1,p2;
    int ret;
    struct my_struct *p = malloc(sizeof(struct my_struct));    
    if(p == NULL){
        return NULL;
    }
    pthread_cond_init(&p->cond,NULL);
    pthread_mutex_init(&p->mutex,NULL);
    p->run = 1;
    ret = pthread_create(&p1,NULL,my_func1,p);
    if(ret < 0){
        perror("pthread_create");
        DEBUG_INFO("pthread_create");
        return -1;
    }
    pthread_detach(p1);

    ret = pthread_create(&p2,NULL,my_func2,p);
    if(ret < 0){
        perror("pthread_create");
        DEBUG_INFO("pthread_create");
        return -1;
    }
    pthread_detach(p2);

    while (p->run)
    {
        sleep(1);
    }
    
    DEBUG_INFO("bye bye");
    return 0;
}

CMakeLists.txt

project(libevent_project)
cmake_minimum_required(VERSION 3.8)
message(STATUS "lkmao:CMAKE_SOURCE_DIR -- ${CMAKE_SOURCE_DIR}")

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread -g -Wall")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -lstdc++")

# add_executable(app epoll.c)
# add_executable(app epoll2.c)
add_executable(app cond.c)

编译脚本:

#!/bin/bash
set -e
rm -rf _build_
mkdir _build_ -p
cmake -S ./ -B _build_
make -C _build_
# ./_build_/main_01
# ./_build_/app
echo ""
file ./_build_/app
echo ""
./_build_/app hello.txt

 

小结

注意:一定要保证 pthread_cond_wait在函数pthread_cond_signal之前运行。否则可能接收到不到信号,造成死锁。例如将my_func1中的sleep(1)放到线程2中,如下图所示:

执行结果如下所示:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1409782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10个免费高质量视频素材网站,无版权,可商用。

推荐10个高清无水印视频素材网站&#xff0c;免费下载&#xff0c;无版权可商用&#xff0c;建议收藏起来&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是个设计素材网站&#xff0c;但除了设计类素材之外还有很多视频、音频、办公类…

22款奔驰GLS450升级香氛负离子车载香薰功能

奔驰原厂香氛系统激活原车自带系统&#xff0c;将香气加藏储物盒中&#xff0c;通过系统调节与出风口相结合&#xff0c;再将香味传达至整个车厢&#xff0c;达到净化车厢空气的效果&#xff0c;让整个车厢更加绿色健康&#xff0c;清新淡雅。星骏汇小许Xjh15863 产品功能&…

django从入门到实践(学习笔记一)

django3学习笔记一 django开发1.创建项目和app2.设计表结构3.在MySQL中生成表4.静态文件管理5.部门管理5.1部门列表6.模板的继承 django开发 主题&#xff1a;员工管理系统 1.创建项目和app 创建app并注册 python manage.py startapp app01注册 2.设计表结构 3.在MySQL中生…

用这个烟感监测技术!同事下巴都惊掉了!

在当今社会&#xff0c;火灾作为一种极具破坏性的灾害&#xff0c;对人们的生命和财产安全构成着严峻的威胁。 为了更好地预防和管理火灾风险&#xff0c;烟感监控系统成为一项不可或缺的技术创新。为各行各业提供了全方位、高效的火灾预警和防范手段。 客户案例 商业办公楼 …

专门为机器学习开发的jpy语言

这本来是一个为工科教学专门开发的附属品&#xff0c;并不是说Python或Java有多不好&#xff0c;根本上它就是一个Java工程教材&#xff0c;但又要结合人工智能。因此&#xff0c;出现了这样一个包容性的怪胎&#xff0c;可以用python一样的语法与Java一起编写。 没流行起来的一…

共享WiFi项目加盟需要怎么操作?

共享WiFi项目作为当前热门的创业选择&#xff0c;越来越多的人选择加入这个行业。如果你也对共享WiFi项目感兴趣&#xff0c;并希望通过加盟方式来开展自己的创业计划&#xff0c;那么接下来&#xff0c;我们将为你详细介绍加盟共享WiFi项目的操作方法&#xff0c;助你成功开启…

【AI绘画】Stable Diffusion使用入门教程!!!!

手把手教你入门绘图超强的AI绘画&#xff0c;用户只需要输入一段图片的文字描述&#xff0c;即可生成精美的绘画。给大家带来了全新保姆级教程资料包 &#xff08;文末可获取&#xff09; 首先提几个好玩的名词&#xff1a; 炼丹&#xff1a;训练AI学习图片生成模型 咒语&…

tee漏洞学习-翻译-1:从任何上下文中获取 TrustZone 内核中的任意代码执行

原文&#xff1a;http://bits-please.blogspot.com/2015/03/getting-arbitrary-code-execution-in.html 目标是什么&#xff1f; 这将是一系列博客文章&#xff0c;详细介绍我发现的一系列漏洞&#xff0c;这些漏洞将使我们能够将任何用户的权限提升到所有用户的最高权限 - 在…

CentOS最优雅的方式安装mysql8

本来想偷个小懒使用yum/dnf安装一下mysq8,但是发现会出现各种问题,系统是CentOS8的. 于是还是使用最原始但是也是比较简单的方法来进行安装: 首先进入到https://dev.mysql.com/downloads/mysql/ 选择系统是Linux-Generic, 然后系统版本x86 64bit, 选择第一个TAR Archive的文件…

MySQL的SQL分类与数据类型

MySQL是一款广泛使用的关系型数据库管理系统&#xff0c;开源、免费且跨平台&#xff0c;常用于存储、管理和检索结构化数据&#xff0c;并通过SQL语言支持高效的数据操作与管理。 文章目录 何为SQLSQL分类DDLDMLDCLTCLDQL MySQL的数据类型数值型日期型字符串型二进制型其他类型…

Java多线程--对比创建多线程的两种方式

文章目录 一、对比两种方式(1)对比(2)Runnable的好处1、案例12、案例2(3)区别和联系(4)补充说明二、笔试题(1)题1(2)题2一、对比两种方式 (1)对比 <1> 两种方式步骤如下: 方式一:继承Thread类 方式二:实现Runnable接口 <2> 演示代码:计算…

uniapp 用css animation做的鲤鱼跃龙门小游戏

第一次做这种小游戏&#xff0c;刚开始任务下来我心里是没底的&#xff0c;因为我就一个‘拍黄片’的&#xff0c;我那会玩前端的动画啊&#xff0c;后面尝试写了半天&#xff0c;当即我就给我领导说&#xff0c;你把我工资加上去&#xff0c;我一个星期给你做出来&#xff0c;…

Idea 连接 mysql 数据库

前言 为了方便直接在 idea 开发工具中直接使用数据库&#xff0c;如查看数据等&#xff0c;可以在 idea 中配置数据库相关属性&#xff0c;实现操作数据库。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 使用步骤 点击最右面的 database&#xff0…

手把手系列!无需 OpenAI 即可搭建 RAG 应用

OpenAI 是时下最火爆的大语言模型&#xff08;LLM&#xff09;&#xff0c;不过除了 OpenAI 以外&#xff0c;还有许多不同的 LLM。此前&#xff0c;我们发布的许多篇文章中都介绍了如何使用 LangChain、Milvus 和 OpenAI 搭建众多 RAG 应用&#xff0c;这次我们来试试不一样的…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏1(附项目源码)

本篇最终效果演示 文章目录 本篇最终效果演示系列目录前言环境素材绘制地形 实现人物移动指示显示物品名称源码完结 系列目录 【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏1&#xff08;附项目源码&#xff09; 【制作100个unity游戏之23】实现类似七日杀、森…

在FreeRTOS上使用软定时器的ESP32开发指南

在FreeRTOS上使用软定时器的ESP32开发指南 在ESP32的开发中&#xff0c;使用FreeRTOS实时操作系统可以有效地提高多任务处理和系统稳定性。其中&#xff0c;软定时器是一项非常有用的功能&#xff0c;它可以让我们在系统中创建定时任务&#xff0c;而无需硬件定时器的支持。 …

基于cubeMX的正点原子miniSTM32对W25Q64的存储使用

一、实现目标 使用cubeMX建立项目工程&#xff0c;结合正点原子提供的hal库对W25Q64闪存调用的例程&#xff0c;实现W25Q64的读写。 二、实现过程 1、首先建立cubeMX工程&#xff0c;其他项设置不再叙述&#xff0c;只看连接W25Q64的SPI设置&#xff0c;这里使用SPI1&#xf…

css display 左右对齐 技巧

.list_number{ display: flex; } .list_name_number{ width:100px; } //左边固定width .list_name_type{ //右边给flex:2 自动撑开 flex:2; }

docker(上)

笔记资料参考与尚硅谷 前提知识课程介绍课程定位学习建议 1前提知识 boot cloud git push pull redis nginx mysql... Linux centos ubuntu 2课程介绍 2.1 2018 vs 2022 2.2 k8s&#xff08;雷峰崖&#xff09; 2.3 大纲 3课程定位&#xff08;因材施教量体裁衣…

Web08--JavaScript高级

1、BOM对象 BOM&#xff1a;browser object model 浏览器对象模型 BOM对象包括window对象、screen对象、history对象、location对象、navigator对象。 1.1 window对象 所有的浏览器都支持window对象。它表示的浏览器窗口 window对象是js中的顶层对象&#xff0c;所有的j…