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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
为保证每个线程对同一资源访问有效,比如一个线程想要从共享资源读数据,而这些资源正在被其他线程修改,那么读出来的数据是无效的,那么就要想办法让其他线程修改完再去读,这时候就用到了同步机制。可以使用Linux系统提供的机制来对线程访问资源的顺序进行同步,本文档挑选了信号量,互斥锁,条件变量来介绍线程同步机制,实验代码在sync/目录下。
4 l) S5 ]6 X9 v  T$ Y, Z& G3 D; g/ J' d
1 POSIX无名信号量$ v: N; U  }& d8 v6 t2 v: A
本章介绍POSIX 无名信号量,以下简称信号量。信号量类似于计数器,操作方法和前面的System V 信号灯基本一样。
& n. I' V4 f, M使用信号量的步骤:5 w3 _4 R; Y7 j2 I$ @6 @
1.在程序全局区定义信号量;
- g$ C8 A, A2 c7 l, L$ E  M$ q2.使用seminit()初始化信号量;- ^6 G# d$ L- F# S; _+ E
3.使用sem_wait()和sem_post()对信号量进行P/V操作;
5 H/ ]+ Q/ c* M$ L( c4.使用sem_destroy()销毁信号量。& \% D( ?7 m1 l
+ h* P8 Y3 w$ U8 J) ?
信号量常用函数如下:) e3 z! B9 S" n) N+ b5 {" e
sem_init():对信号量值进行初始化,
% x0 X3 |; S. ?6 v#include+ C% S5 z8 n, d, [6 j/ j8 W
int sem_init(sem_t *sem, int pshared, unsigned int value);6 }  m, Y& u; z. S" t4 `- \4 d
参数含义:
- F% ?' l3 Y. x5 ysem:指针,指向定义的信号量;8 w  ^* A0 q) E
pshared:指明这个信号量用于进程还是线程,0为线程,不等于0为进程,本节填写为0。
9 c3 [- v5 Z* x  }value:信号量初始值
4 G( m# q0 D* @* {5 H! x) _$ ^返回值:成功返回0,错误返回-1。
. s! p3 r/ @5 ~) m. O+ b
3 X1 l: W0 R2 X& a# Vsem_wait():等待一个信号量,进行P操作,信号量值-1;
' R. e  b6 D1 O& k7 n8 U, ?* E: zsem_post():唤醒一个信号量,进行V操作,信号量值+1,定义如下:1 e% g" s, N) y' s
#include' Q5 w! B+ S, d
int sem_wait(sem_t *sem);
) e- d' t' [; h& t, d  P5 s3 j- Dint sem_post(sem_t *sem);; _% S( F3 a. B* s: ?* M
参数含义:
5 A: U5 d7 x& ^( N9 Usem:要操作的信号量;, ~& G& x# F5 k* a
返回值:成功返回0,错误返回-1。
, s4 Y7 \& U5 Y5 u
) K1 g# v* \3 N9 J  X# |- y- msem_destroy():销毁初始化后的信号量
1 Z, n2 \, ~! a7 A  I3 r) v' U) U#include. Z3 z* x8 I+ ?. Q# ^4 B/ W
int sem_destroy(sem_t *sem);
6 S' J( s/ y! p0 \  ]sem:要操作的信号量;) n3 |( S6 D) O# n  C, W/ V
返回值:成功返回0,错误返回-1。# L/ m% \% z2 l5 H' ]: d" M4 v
7 u, r, N) t- g; v* ^1 |, H0 C# b: K
实验代码在sync/sem.c:路径为:11_Linux系统开发进阶\Linux系统编程_章节使用资料。
% @: q: d) P+ E, L使用信号量控制读写线程,初始化时写信号量为1,读信号量为0,那么读线程就会阻塞,写线程就会执行并将写信号-1,写线程在fgets等待输入,当输入完成后,将读信号+1唤醒读线程,这样读写线程交替执行就完成了同步。
- A0 T, o& v) c0 h4 d( g2 ?6 I4 u
& t3 b3 _1 U# T; H* z9 b6 r) w4 p& m& s

( H' U9 W7 D* G2 n$ v! \& N# n5 y' {+ d) {
1 k7 F$ u+ O; Z/ M. j7 M; r

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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