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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
为保证每个线程对同一资源访问有效,比如一个线程想要从共享资源读数据,而这些资源正在被其他线程修改,那么读出来的数据是无效的,那么就要想办法让其他线程修改完再去读,这时候就用到了同步机制。可以使用Linux系统提供的机制来对线程访问资源的顺序进行同步,本文档挑选了信号量,互斥锁,条件变量来介绍线程同步机制,实验代码在sync/目录下。9 f% c6 @9 ~) M8 r
& j  v8 h, [9 t3 o1 @
1 POSIX无名信号量# z0 y; ~: A3 M2 V
本章介绍POSIX 无名信号量,以下简称信号量。信号量类似于计数器,操作方法和前面的System V 信号灯基本一样。
$ G5 }6 i/ h/ Q9 l使用信号量的步骤:* x. Z/ s# _7 F4 s! t0 m
1.在程序全局区定义信号量;& E& w2 T5 T/ h) f4 A& H: T9 u
2.使用seminit()初始化信号量;
" Q; q+ a; Y- j; a9 e2 a3.使用sem_wait()和sem_post()对信号量进行P/V操作;4 n2 e7 |# M$ I0 ~0 v
4.使用sem_destroy()销毁信号量。( r0 P+ P1 B2 j3 O

1 G! Q* h7 Q* i, e; o4 z7 U' r信号量常用函数如下:
) T; \8 a+ M% _; N$ G  ysem_init():对信号量值进行初始化,# n0 f0 t8 P7 ?% K% r, [9 r
#include
$ g* P5 e, y, {5 z4 u! y5 B7 Gint sem_init(sem_t *sem, int pshared, unsigned int value);
5 J% _. @: m# L, S3 C2 L* V* l参数含义:2 D# M2 L; F' g  U
sem:指针,指向定义的信号量;
* f7 {' I3 _- _8 z1 mpshared:指明这个信号量用于进程还是线程,0为线程,不等于0为进程,本节填写为0。
' D3 ^  }# q/ X$ a) t& nvalue:信号量初始值9 I" Z  Y* I) t$ t/ I' `' Z1 n
返回值:成功返回0,错误返回-1。5 `1 e6 B5 A2 A/ Z' ]2 z2 k  o3 A4 N. |/ z
: r' R9 n' ^4 c+ O+ o" L$ H
sem_wait():等待一个信号量,进行P操作,信号量值-1;# z5 f4 }- K; P* c
sem_post():唤醒一个信号量,进行V操作,信号量值+1,定义如下:
9 U8 p  \  y! C7 d7 E6 [#include
1 q, J- C  \8 K# {- @( M* o" n8 w3 Kint sem_wait(sem_t *sem);
6 @9 x6 R( B0 h. w9 \- g8 xint sem_post(sem_t *sem);& }9 `1 g% u7 n  Q0 i# b3 [) ]
参数含义:
9 H4 t5 U/ {3 Ksem:要操作的信号量;
3 Q$ \" K8 l" e8 Z  ?! b返回值:成功返回0,错误返回-1。: \) F8 ^+ e8 H2 U; E1 X5 O
+ t+ G9 I& E5 ?& m
sem_destroy():销毁初始化后的信号量
6 e5 @% B+ v3 a& z#include
  k5 l% q0 O; D) n1 P% }) i" y  _int sem_destroy(sem_t *sem);
' G  o  \2 |" }sem:要操作的信号量;
8 i3 H/ e; O3 I, c6 s返回值:成功返回0,错误返回-1。9 J; [" W7 L& m- {5 {3 U

9 U1 T; t* ^- n$ Q5 ^4 e* n实验代码在sync/sem.c:路径为:11_Linux系统开发进阶\Linux系统编程_章节使用资料。1 `. F. A- ^9 }6 |* a9 w( c
使用信号量控制读写线程,初始化时写信号量为1,读信号量为0,那么读线程就会阻塞,写线程就会执行并将写信号-1,写线程在fgets等待输入,当输入完成后,将读信号+1唤醒读线程,这样读写线程交替执行就完成了同步。
7 o: @8 I' u0 P8 P
! Z! {2 u! d  g- N3 d" K+ p! L+ c9 v  y. C7 p+ W) }/ I0 q
: Z4 j; j' ]# f. P  ?

' U7 ]2 v% c7 x6 x9 [7 ^
5 E) l& x3 x' J6 B

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-25 06:02 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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