找回密码
 注册
关于网站域名变更的通知
查看: 619|回复: 1
打印 上一主题 下一主题

i.MX6ULL开发板线程同步POSIX无名信号量

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-4-2 14:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
为保证每个线程对同一资源访问有效,比如一个线程想要从共享资源读数据,而这些资源正在被其他线程修改,那么读出来的数据是无效的,那么就要想办法让其他线程修改完再去读,这时候就用到了同步机制。可以使用Linux系统提供的机制来对线程访问资源的顺序进行同步,本文档挑选了信号量,互斥锁,条件变量来介绍线程同步机制,实验代码在sync/目录下。  ^2 A$ Q6 M- v* U
) d7 V$ i. L' Z( E# R
1 POSIX无名信号量9 r( \* H2 l* e+ N) C
本章介绍POSIX 无名信号量,以下简称信号量。信号量类似于计数器,操作方法和前面的System V 信号灯基本一样。2 d% ]7 p0 \7 Q( U; o
使用信号量的步骤:8 q, b2 u# j/ m* A  o' {! ^! j. C
1.在程序全局区定义信号量;
; C" U8 x! B3 n' F8 h, ?2.使用seminit()初始化信号量;) O5 d( l# `/ }6 \' F! x- h
3.使用sem_wait()和sem_post()对信号量进行P/V操作;0 u; N+ \, ~2 [7 ?* E
4.使用sem_destroy()销毁信号量。
* l5 P/ N0 w* R7 y. V- h+ q& A: [/ V9 l/ t. E- e5 D
信号量常用函数如下:
9 y( n# o& J7 `1 ]sem_init():对信号量值进行初始化,
4 E3 p% T6 Z" k2 M# }! |5 [! a#include2 d. ~7 i2 @. |- a+ O% V
int sem_init(sem_t *sem, int pshared, unsigned int value);
& h! C+ ~3 _7 C5 V  a6 W参数含义:- T; v4 K, _+ ~0 g( L
sem:指针,指向定义的信号量;5 C( s: K! [- i1 P. n
pshared:指明这个信号量用于进程还是线程,0为线程,不等于0为进程,本节填写为0。
: N+ h% s) c1 V6 evalue:信号量初始值
1 i3 O+ Y( r0 L( b6 S3 z返回值:成功返回0,错误返回-1。  U: {4 m8 _. Y  ^% x6 k' B/ U

, h$ }: L8 |+ p* l9 osem_wait():等待一个信号量,进行P操作,信号量值-1;, Z) T  S: x$ a
sem_post():唤醒一个信号量,进行V操作,信号量值+1,定义如下:
: p. m" @: r5 Y" R: P* z# o# M6 Z#include
9 _( j8 `" p7 j: D2 l7 B4 Zint sem_wait(sem_t *sem);
% P7 g8 L2 I: T$ X* v3 s; {; Aint sem_post(sem_t *sem);
8 u' d) M/ |+ D7 y3 `( @参数含义:. K, {- P1 t$ T* \5 T8 {: k3 y
sem:要操作的信号量;. T0 R& L( Z  V5 F2 j! Q
返回值:成功返回0,错误返回-1。1 {: l4 a* h0 ]0 n: S7 A

9 N2 K& A0 Z: xsem_destroy():销毁初始化后的信号量
1 N. p7 ]4 Q% n! Z#include
( c; S8 j" m- Y4 tint sem_destroy(sem_t *sem);6 r! X8 o+ i! F% h) u
sem:要操作的信号量;
6 |' N4 h# _- J  |# X! I1 Z返回值:成功返回0,错误返回-1。
9 r) O$ k1 L! n! V- ]
) S& n% c: T3 X9 e9 O% |$ t" A4 S实验代码在sync/sem.c:路径为:11_Linux系统开发进阶\Linux系统编程_章节使用资料。
. _& P( n" H$ \9 P4 o使用信号量控制读写线程,初始化时写信号量为1,读信号量为0,那么读线程就会阻塞,写线程就会执行并将写信号-1,写线程在fgets等待输入,当输入完成后,将读信号+1唤醒读线程,这样读写线程交替执行就完成了同步。
0 F  h0 t( \* o) k$ C0 O5 z
, j3 v- x' |$ L  x/ l1 @& X& y0 \: @9 N2 E
& n$ |  C$ `2 i! n4 V, Y9 Z  s

& C) X3 V0 C) n7 U2 E
9 ]6 A: U- l/ V( ~* E- o

该用户从未签到

2#
发表于 2021-4-2 15:45 | 只看该作者
是的,为保证每个线程对同一资源访问有效,比如一个线程想要从共享资源读数据,而这些资源正在被其他线程修改,那么读出来的数据是无效的,那么就要想办法让其他线程修改完再去读,这时候就用到了同步机制。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 12:48 , Processed in 0.156250 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表