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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
为保证每个线程对同一资源访问有效,比如一个线程想要从共享资源读数据,而这些资源正在被其他线程修改,那么读出来的数据是无效的,那么就要想办法让其他线程修改完再去读,这时候就用到了同步机制。可以使用Linux系统提供的机制来对线程访问资源的顺序进行同步,本文档挑选了信号量,互斥锁,条件变量来介绍线程同步机制,实验代码在sync/目录下。
9 U2 P" P) M$ }/ p% M& b  D0 N( Z. p5 q; I! A
1 POSIX无名信号量
* D& e8 N. H: D: h本章介绍POSIX 无名信号量,以下简称信号量。信号量类似于计数器,操作方法和前面的System V 信号灯基本一样。
3 [/ E% l0 {  z8 X9 x5 z6 ?& O使用信号量的步骤:
& T4 L' C6 k1 _% C9 m$ |5 G1.在程序全局区定义信号量;- c1 a5 l0 a- H* H- p' O5 B
2.使用seminit()初始化信号量;( ~2 q( z5 h8 k$ P8 ^: M
3.使用sem_wait()和sem_post()对信号量进行P/V操作;
; {, |. m# S) d" G* x% l9 C% |4.使用sem_destroy()销毁信号量。
% s# A3 N1 @1 _8 @3 K
( d  V# g( f* C: B+ b9 d信号量常用函数如下:
& \  a) l$ L. k( N- n; ysem_init():对信号量值进行初始化,
. U: e5 B: u  }8 A" M) X#include) L" k1 Y9 Y" [4 `
int sem_init(sem_t *sem, int pshared, unsigned int value);- F1 t9 x* v" U" T4 X3 [* ~3 ^
参数含义:( E7 A% m% S+ d( E* m3 y# Z5 g
sem:指针,指向定义的信号量;
* `* c9 [/ W8 X* Dpshared:指明这个信号量用于进程还是线程,0为线程,不等于0为进程,本节填写为0。) \6 l" {) v# x# Y3 n/ ]. _
value:信号量初始值) G  a% j* u7 U& n
返回值:成功返回0,错误返回-1。5 c' n" o5 T: o' [

5 e4 ?% O1 \" x8 q! Z% I# H2 osem_wait():等待一个信号量,进行P操作,信号量值-1;
) C' w1 Z4 u* @sem_post():唤醒一个信号量,进行V操作,信号量值+1,定义如下:9 D- b) j5 t0 M4 _9 F% k6 i
#include
: w) O2 a' K; y$ l  i# E( N) z  rint sem_wait(sem_t *sem);
, i8 u) w; P- B! x# d. u$ D/ [% sint sem_post(sem_t *sem);
/ D6 F" K/ \6 O% a参数含义:
" U" u: x: T* v% @  O& `sem:要操作的信号量;
: G, A/ l, V: T返回值:成功返回0,错误返回-1。1 u& d# s# v( |' ?3 i' K3 k
3 c/ [5 [6 _( ]  x: {# ^0 d
sem_destroy():销毁初始化后的信号量
% K% l3 a# M" h, P" [) y% N#include
. U9 V  n1 ^6 b* Lint sem_destroy(sem_t *sem);
, Z2 X9 ]+ a8 q" W6 A' nsem:要操作的信号量;2 |1 j9 u4 S' g9 q8 f% ]3 @" z
返回值:成功返回0,错误返回-1。0 Q4 F* P% w% g. C
2 x. S9 a' L7 Z
实验代码在sync/sem.c:路径为:11_Linux系统开发进阶\Linux系统编程_章节使用资料。
/ P; m! @$ S/ \: E% A  w! @使用信号量控制读写线程,初始化时写信号量为1,读信号量为0,那么读线程就会阻塞,写线程就会执行并将写信号-1,写线程在fgets等待输入,当输入完成后,将读信号+1唤醒读线程,这样读写线程交替执行就完成了同步。
3 L) l" N0 n6 l! U4 o% Q" \* r
' R2 d( {9 L7 {4 L# M; ]& }8 k/ f2 R) B7 l& a( G
( h2 V# i3 Y: W
1 a- f/ [0 ?# o/ D
2 w# u) ?8 C  N/ W

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 11:49 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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