pthread库学习(2): 线程的同步,使用信号量

【互斥锁与信号量】线程通信:互斥锁(mutex)与信号量(semaphore) 总的来说,互斥锁和信号量都是线程和进程同步的重要工具。互斥锁主要用于保护资源,保证同一时间只有一个线程或进程访问某一资源,从而避免并发问题。而信号量更多的是用于线程和进程之间的通信和同步,控制在一定范围内的并发访问,为程序提供更细粒度的并发控制。 掌握互斥锁和信号量的使用和区别,能极大地提高多线程和多进程编程的效率和稳定性。 阅读详情
先看下面这段程序,主线程创建了三个线程,每个线程中均有一个打印语句。

#include <stdio.h>

#include <pthread.h>

#include <semaphore.h>

 void *thread_a(void *in)

{

printf("I am thread_a/n");

pthread_exit((void *)0);

}

 

void *thread_b(void *in)

{

printf("I am thread_b/n");

pthread_exit((void *)0);

}

 

void *thread_c(void *in)

{

    printf("I am thread_c/n");

pthread_exit((void *)0);

}

 

int main()

{

    pthread_t a,b,c;  /* thread id a, b, c*/

    int val;         /* used for function return result */

 

    /* create thread a, b, c */

    pthread_create(&a, NULL, thread_a, (void *)0);

    pthread_create(&b, NULL, thread_b, (void *)0);

    pthread_create(&c, NULL, thread_c, (void *)0);

 

    /* main thread waits for termination of a,b,c */

    pthread_join(a, (void **)0);

    pthread_join(b, (void **)0);

    pthread_join(c, (void **)0);

 

    printf("Main thread is over/n");

    return 0;

}

在Linux下进行编译: gcc -o My_Thread My_Thread.c ./MyThread
得到的输出:
 I am thread_a
I am thread_b
I am thread_c
Main thread is over

现在我们希望线程C的最先打印,然后线程B打印,最后线程A打印。即三个线程之间的打印有一定的先后关系。看下面程序:

#include <stdio.h>

#include <pthread.h>

#include <semaphore.h>

sem_t sem1;

sem_t sem2;

void *thread_a(void *in)

{

    sem_wait(&sem1);       /* wait for sem1 */

    printf("I am thread_a/n");

    pthread_exit((void *)0);

}

 

void *thread_b(void *in)

{

    sem_wait(&sem2);       /* wait for sem2 */

    printf("I am thread_b/n");

    sem_post(&sem1);       /* increase sem1 by 1, make thread_a run*/

    pthread_exit((void *)0);

}

 

void *thread_c(void *in)

{

    printf("I am thread_c/n");

    sem_post(&sem2);      /* increase sem2 by 1, make thread_b run*/

    pthread_exit((void *)0);

}

 

int main()

{

    pthread_t a,b,c;  /* thread id a, b, c*/

    int val;         /* used for function return result */

 

    /* init sem1 sem2 to 0 , any thread waits for it will be blocked*/

    sem_init(&sem1, 0, 0);

sem_init(&sem2, 0, 0);

   

/* create thread a, b, c */

pthread_create(&a, NULL, thread_a, (void *)0);

pthread_create(&b, NULL, thread_b, (void *)0);

pthread_create(&c, NULL, thread_c, (void *)0);

 

    /* main thread waits for termination of a,b,c */

    pthread_join(a, (void **)0);

    pthread_join(b, (void **)0);

    pthread_join(c, (void **)0);

 

    /* destroy sem1 sem2 */

    sem_destroy(&sem1);

    sem_destroy(&sem2);

 

    printf("Main thread is over/n");

    return 0;

}

gcc -o My_thread1 My_thread1.c -lpthread
./My_thread1
I am thread_c
I am thread_b
I am thread_a
Main thread is over

可以见到,线程的执行顺序已经改变。
嵌入式学习——2——线程(pthread) 线程是进程的最小组成单位:一个进程里面,至少有一个线程的存在,称为主线程,main函数运行的就是所谓的主线程。 阅读详情

相关推荐

C++:pthread的使用

pthread 是 POSIX 线程(POSIX Threads)的简称,它是 POSIX 标准中定义的线程接口规范。pthread 库提供了一系列函数,用于创建、销毁、同步和管理线程。在类 Unix 系统(如 Linux、macOS)中,pthread 库被广泛使用,是实现多线程编程的重要工具。

qq_43441284的博客 1379

pthread多线程时sigalrm和setitimer的使用

目录 1、signal 2、signal的注册和捕捉 3、setitimer 1、signal 信号定义在signal.h头文件中,信号名都定义为正整数。 具体的信号名称可以使用kill -l来查看信号的名字以及序号,信号是从1开始编号的,不存在0号信号。kill对于信号0有特殊的应用,kill命令就是发送信号的。 信号的处理有三种方法,分别是:忽略、捕捉和默认动作 忽略信...

Robben.Han 2456

线程的同步与互斥:条件变量&信号量

条件变量与互斥锁一样,都是一种数据变量,这两者通常搭配起来使用。 条件变量的作用: 实现线程的同步与互斥: 接口:

YANG 4072

线程pthread与POSIX信号量

一、认识主线程 getpid()得到的是进程的pid,在内核中,每个线程都有自己的PID,要得到线程的PID,必须用syscall(SYS_gettid)。 pthread_self函数获取的是线程ID,线程ID在某进程中是唯一的,在不同的进程中创建的线程可能出现ID值相同的情况。 在1个进程中新建1个线程,那么就出现了2个tid与1个pid,而其中有一个 tid == pid,那么该...

Jan___的博客 778

C例子:信号量同步线程

该程序是我写的博客“一起talk C栗子吧(第一百一十四回:C语言实例--线程同步之信号量二)”的配套程序,共享给大家使用

【深度学习】tensorboard中的图片放到论文中

1. 利用tensorboard中的导出数据功能 选中左上角的标签,然后选择csv格式的数据下载即可。 左边的smoothing 数值不影响导出数据的大小。 2.tensorboard 图下标签介绍: 放大 Toggle y-axis log scale:将y轴对数化 Fit domain to data:如果拖动了图片等,再重新回到原始位置 Download Current Chart as SVG 3.用下载下来的csv数据来画图 第一幅图片:训练的平均长度 fig, ax1 = plt.sub

gaocui883的博客 1万+

【C/C++多线程编程之七】pthread信号量

多线程编程之信号量      Pthread是 POSIX threads 的简称,是POSIX的线程标准。          互斥量用来处理一个共享资源的同步访问问题,当有多个共享资源时,就需要用到信号量机制。          信号量机制用于保证两个或多个共享资源被线程协调地同步使用,信号量的值对应当前可用资源的数量。          1.信号量(samaph

Jiangwei的专栏 1万+

告别环境配置焦虑:在Win10的Ubuntu子系统里搞定CSAPP实验环境(附32/64位库编译指南)

本文详细介绍了如何在Win10的Ubuntu子系统中搭建CSAPP实验环境,包括WSL 2的安装与配置、32/64位库的编译指南以及高效开发工具链的设置。通过优化WSL性能和使用实用技巧,开发者可以轻松应对CSAPP实验中的环境配置问题,提升学习效率。

weixin_30443813的博客 297

pthread分别使用互斥量、条件变量、信号量实现barrier

导入 在多线程编程里,路障(Barrier)是一个非常有利的工具。大概有以下几种应用场景; 希望各线程重新同步。有一些线程可能在某些阶段执行的相对较快,如果我们需要它们同步进入下一阶段,就要用到Barrier。 调试程序。多线程程序不像单线程程序那样可以很方便进行调试。有些时候一些线程的一些变量值被不经意修改导致在运行下一阶段时出现bug。这时候就需要使用Barrier,让大家都停一停,打印自己的变量信息。 pthread不提供路障的实现,需要我们自己手动实现。本文提供了三种实现方式。 建模 barri

weixin_45793220的博客 2001

人工智能 (Artificial Intelligence, AI) 原理与代码实例讲解

人工智能 (AI) 机器学习 (Machine Learning) 深度学习 (Deep Learning) 算法 模型 代码实例 应用场景 1. 背景介绍 人工智能 (Artificial Intelligence, AI) 作为一项前沿科技,近年来发展迅速,已渗透到生活的方方面面

AI架构师小马 1230

pytest学习和使用19-pytest断言失败后,怎样保持后续的断言继续执行?(pytest-assume)

【代码】pytest学习和使用19-pytes断言失败后,怎样保持后续的断言继续执行?

虫无涯的博客 1391

【PTHREAD】线程互斥与同步之信号量

【PTHREAD】线程互斥与同步之信号量

zhy29563 641

【Burp入门第二篇】Chrome配置BurpSuite代理教程

1、配置Burp代理为127.0.0.1:80802、扩展商店添加插件switchyomega,修改服务器和端口为下图:3、打开代理,选择刚才添加的代理

等风来 8368

Linux pthread线程操作 和 线程同步与互斥操作

介绍线程的使用,信号量 和 互斥量 和 条件变量 和 线程池!

cpp_learner的博客 3998

YOLOv8目标出入计数部署:讲解C#使用ONNX检测模型进行目标出入计数 可运行完整实例

代码、步骤、讲解完整,可一键运行,效果如下:车辆出入计数人员出入计数。

Limiiiing的博客 79

AI大模型入门到实战系列(二十一)命名实体识别(NER)

命名实体识别(NER)是自然语言处理中的关键任务,旨在从文本中识别并分类预定义类别的实体(如人名、地点、组织等)。其核心步骤包括文本预处理、实体边界检测和类型分类。主流技术方法经历了从基于规则、统计机器学习到深度学习的演进,当前主要采用预训练语言模型(如BERT)和序列标注技术(如BiLSTM-CRF)。关键技术挑战包括实体边界模糊、嵌套实体和领域适应等问题。NER广泛应用于信息抽取、搜索引擎优化和知识图谱构建等领域,常用精确率、召回率和F1值作为评估指标。实际应用中通常采用BIO标注体系,并通过标签对齐处

echo的博客 1624

Linux线程——线程互斥、同步、POSIX信号量

本文探讨了线程互斥与同步的概念及其实现方法。文章首先通过模拟抢票程序展示了多线程访问共享资源时可能出现的数据不一致问题,如票数出现负值的情况。分析指出,这是由于共享资源访问未加保护导致的线程安全问题。 为解决这一问题,文章介绍了使用pthread库中的互斥量(mutex)来保护共享资源。通过加锁机制,确保同一时间只有一个线程能访问关键代码段,从而避免了数据竞争。文章详细解析了ticket自减操作的汇编实现,结合操作系统分时调度的特点,解释了数据不一致的根本原因。 此外,文章还简要提及POSIX信号量的使用,

2301_79705195的博客 1447

uniapp - H5网页打包运行报错Failed to load resource: net::ERR_FILE_NOT_FOUND(uniApp打包成H5部署到服务器,打包h5白屏并报错页面空白)

Failed to load resource: net::ERR_FILE_NOT_FOUND,uniapp 坑之打包之后白屏,uniapp打包h5,HBuilderX 打包H5后空白报错 Failed to load resource: net::ERR FILE NOT_FOUND,UNI-APP H5应用白屏(空白页)解决方案,白屏并报错Failed to load resource: net::ERR_FILE_NOT_FOUND,uniapp开发,打包成H5部署到服务器,uniapp打包之后首页

🏆 前端领域优质创作者 3579

线程:线程创建pthread_create,线程间的同步与互斥

作业一:创建3个线程,一个子线程拷贝文件的前一半,一个子线程拷贝后一半文件,主线程回收子线程资源。 作业二:使用无名信号量实现循环输出 春、夏、秋、冬。 作业三:互斥锁,无名信号量,条件变量再联系一遍。

m0_58572142的博客 2230

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

pthread线程的控制

放在线程启动之前。

2401_83336258的博客 2075

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

线程同步中的锁和信号量

由于工作上用到线程之间的同步,而且有超时处理,问题是:子主线程等待的时候已经加锁了,为什么主线程中还可以再去加锁给子线程发送信号呢? pthread_cond_timedwait()函数有三个入口参数: pthread_cond_t __cond:条件变量(触发条件) pthread_mutex_t __mutex: 互斥锁 struct timespec __abstime: 等待时间(其值为系统时间 + 等待时间) 当在指定时间内有信号传过来时,pthread_cond_timedwait()返回0

韩搏专栏 3万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

线程学习day2---pthread——线程的互斥、同步、产生死锁

互斥锁类型 互斥锁变量 内核对象信号量的类型 信号量的变量。

m0_62035519的博客 1003

【Linux】pthread多线程同步

线程同步与互斥锁机制 本文介绍了线程同步的核心概念和互斥锁的应用。线程共享全局变量时可能引发数据安全问题,临界区的原子操作需要通过同步机制保证。互斥锁(mutex)是最常用的同步工具,通过锁定和解锁操作确保同一时间只有一个线程访问共享资源。文章详细解析了互斥锁的5个关键API函数:初始化(pthread_mutex_init)、加锁(pthread_mutex_lock/pthread_mutex_trylock)、解锁(pthread_mutex_unlock)和销毁(pthread_mutex_dest

Antonio915的博客 1006

C++ pthread库

pthread库基本函数创建线程终止线程连接线程分离线程互斥量mutex条件变量cond其余函数线程属性线程属性结构体线程属性函数 基本函数 创建线程 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg); 参数说明: 第一个参数表示线程id。 第二个参数表示线程参数。 第三个是线程的入口函数,入口函数的返回值必须为void*,且入口函数必须为

TABE_的博客 4984
上一篇: pthread库学习(1): 线程的创建
下一篇: 新年许愿
direstrait
博客等级 码龄24年 0粉丝 8原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值