EDA365电子论坛网
标题:
i.MX6ULL开发板线程同步POSIX无名信号量
[打印本页]
作者:
阳阳天
时间:
2021-4-2 14:00
标题:
i.MX6ULL开发板线程同步POSIX无名信号量
为保证每个线程对同一资源访问有效,比如一个线程想要从共享资源读数据,而这些资源正在被其他线程修改,那么读出来的数据是无效的,那么就要想办法让其他线程修改完再去读,这时候就用到了同步机制。可以使用
Linux
系统提供的机制来对线程访问资源的顺序进行同步,本文档挑选了信号量,互斥锁,条件变量来介绍线程同步机制,实验代码在sync/目录下。
1 {, ]" |7 h/ H: s7 j" y5 F* a1 x! Z' u
& ?% V, a$ r* P0 g% v8 f
1 POSIX无名信号量
" H. A: i I5 p% u7 L% x8 I0 @
本章介绍POSIX 无名信号量,以下简称信号量。信号量类似于计数器,操作方法和前面的System V 信号灯基本一样。
, Z/ ]- [: Z+ m5 [& ` [
使用信号量的步骤:
+ x4 ~, n- I& L$ c$ z
1.在程序全局区定义信号量;
) j. x! D7 \ U' _* L9 x
2.使用seminit()初始化信号量;
& \. Q* Q% V! @- f, g7 a6 h
3.使用sem_wait()和sem_post()对信号量进行P/V操作;
" \* ^/ P! `- G s
4.使用sem_destroy()销毁信号量。
8 F3 v/ D6 U4 |6 D, n# U+ E; [
" e5 W/ z, N- [% z. \* A- K4 l
信号量常用函数如下:
2 ~) o( ^" k0 X! Q# n% e& j6 R7 ~! |
sem_init():对信号量值进行初始化,
% \1 n! \3 h d. [4 Y! r. r/ ?" I
#include
+ c& f1 J9 e: W" X$ {: g
int sem_init(sem_t *sem, int pshared, unsigned int value);
, Q3 U( e. {) X7 S. Z! |
参数含义:
5 w: {4 R3 o7 J- \) n" i- Z
sem:指针,指向定义的信号量;
" y ^* ?0 S1 _2 p' o, ~+ l$ O5 P
pshared:指明这个信号量用于进程还是线程,0为线程,不等于0为进程,本节填写为0。
; W3 V1 F, |7 R' c3 p) M4 r
value:信号量初始值
9 m9 t" p$ a1 L9 r' O" j; E Q
返回值:成功返回0,错误返回-1。
5 r! v& g8 w* ~1 u2 g$ U4 `
+ U9 X: k, k- G. L3 \
sem_wait():等待一个信号量,进行P操作,信号量值-1;
, C$ U- F7 l; h& C) {/ \. a* Q2 Y5 `3 f
sem_post():唤醒一个信号量,进行V操作,信号量值+1,定义如下:
* Q5 S7 Y2 G' f6 s
#include
5 x9 P& G3 h7 Y( ]* T v3 V
int sem_wait(sem_t *sem);
; O8 y% X3 y+ @8 f7 j/ L
int sem_post(sem_t *sem);
6 |: |8 l1 D1 R ] c
参数含义:
5 V! K1 j8 ]" t
sem:要操作的信号量;
7 _! I& E8 R' o% X; _
返回值:成功返回0,错误返回-1。
+ {. ^( ^- f2 x5 x3 U
; V" t" D+ O( t C6 F
sem_destroy():销毁初始化后的信号量
) o6 u ?0 t2 J; Z# q
#include
. o+ [& Y# e1 `' x0 v
int sem_destroy(sem_t *sem);
% x1 y, ~" d. n3 p- c2 N* p* P' O( O
sem:要操作的信号量;
& T( ?7 m/ D! a0 V
返回值:成功返回0,错误返回-1。
; r/ z$ A0 E, G4 l9 N
7 P2 d ]2 A1 V) g
实验代码在sync/sem.c:路径为:11_Linux系统开发进阶\Linux系统编程_章节使用资料。
: H) v. x: T! b: e! O3 q* {6 q
使用信号量控制读写线程,初始化时写信号量为1,读信号量为0,那么读线程就会阻塞,写线程就会执行并将写信号-1,写线程在fgets等待输入,当输入完成后,将读信号+1唤醒读线程,这样读写线程交替执行就完成了同步。
- `. T" Q( a/ K4 P B
4 O0 U# m+ F5 c7 D
W; G" l- z1 s/ q% h) a
' [, m& E) u8 ]+ ?1 R e$ p
- G6 \8 L3 A; y
# q& J9 }+ P4 {$ p, \! Q
作者:
hope123
时间:
2021-4-2 15:45
是的,为保证每个线程对同一资源访问有效,比如一个线程想要从共享资源读数据,而这些资源正在被其他线程修改,那么读出来的数据是无效的,那么就要想办法让其他线程修改完再去读,这时候就用到了同步机制。
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2