b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

[Linux多线程同步机制](2)

电脑杂谈  发布时间:2020-04-21 22:32:30  来源:网络整理

三个,信号灯

信号灯和互斥锁与条件变量之间的主要区别是“灯”的概念. 点亮表示资源可用,而熄灭表示不可用. 如果后两种同步方法关注“等待”操作,即资源不可用,则信号量机制关注照明,即告诉资源可用;没有意思等待线的解锁或发射条件,也没有等待灯的状态. 线的点亮操作是有效的,并且可以保持灯点亮. 当然,这样的操作原语也意味着更多的开销.

除了诸如开/关灯之类的二进制灯外,信号灯的应用还可以使用数量大于一的灯来指示资源数量大于一. 在这种情况下,它可以称为多变量灯.

1. 创建并注销

POSIX信号量标准定义了两种命名信号量和未命名信号量,但是LinuxThreads的实现只有一个未命名信号量,同时,众所周知的信号量与未命名信号量没有太大区别. 始终是多个过程之间可用的区别,所以下面将仅讨论无名灯.

int sem_init(sem_t * sem,int pshared,无符号int值)

这是用于创建信号量的API,其中value是信号量的初始值,而pshared指示它是否被多个进程共享,而不仅仅是一个进程. LinuxThreads不实现多进程共享信号量,因此所有非零的pshared输入将导致sem_init()返回-1,并将errno设置为ENOSYS. 初始化的信号灯具有sem变量的特征,可用于以下照明和灭火操作.

int sem_destroy(sem_t * sem)

被取消的信号量要求没有线程在等待信号量,否则它返回-1并将errno设置为EBUSY. 另外,LinuxThreads的信号量注销功能没有其他作用.

2. 打开和关闭

int sem_post(sem_t * sem)

照明操作自动将信号量值加1,表示已添加可访问资源.

进程 线程 linux_linux多线程_linux进程与线程

int sem_wait(sem_t * sem)

int sem_trywait(sem_t * sem)

sem_wait()是等待灯操作,等待灯打开(信号量值大于0),然后以原子方式将信号量减1并返回. sem_trywait()是sem_wait()的非阻塞版本. 如果信号量计数大于0,则原子递减1并返回0,否则立即返回-1,并将errno设置为EAGAIN.

3. 获取灯值

int sem_getvalue(sem_t * sem,int * sval)

以sem读取灯泡计数,将其存储在* sval中,然后返回0.

4. 其他

sem_wait()被实现为取消点,并且在支持原子“比较和交换”指令的体系结构上,sem_post()是唯一可用于异步信号处理功能的POSIX异步信号安全API.

四个异步信号

由于LinuxThreads是在内核外部使用内核内部的轻量级进程实现的线程,因此基于内核的异步信号操作对线程也是有效的. 但是同时,因为异步信号实际上总是发送到进程,所以POSIX标准要求“信号到达进程,然后进程将信号分配给所有不阻塞信号的线程”原语,但是影响其中一个线程.

POSIX异步信号也是标准C库提供的功能,主要包括信号集管理(sigemptyset(),sigfillset(),sigaddset(),sigdelset(),sigismember()等),信号处理功能安装(sigaction()),信号阻止控件(sigprocmask()),阻止的信号查询(sigpending()),信号等待(sigsuspend())等,它们可以实现进程之间的异步信号以及诸如发送之类的功能信号kill()功能. LinuxThreads程周围封装了sigaction()和raise(). 本节重点介绍LinuxThreads中扩展的异步信号函数,包括三个函数pthread_sigmask(),pthread_kill()和sigwait(). 毫无疑问,所有POSIX异步信号功能都可用于线程.

int pthread_sigmask(int方式,const sigset_t * newmask,sigset_t * oldmask)

设置线程的信号掩码代码. 语义与sigprocmask()相同,但是保护了不允许屏蔽的Cancel信号和不允许响应的Restart信号. 被屏蔽的信号保存在信号队列中,可以通过sigpending()函数取出.

int pthread_kill(pthread_t线程,int签名)

将忽略信号发送到线程号线程. 在实现中,在通过线程线程号找到相应的进程号之后,使用kill()系统调用完成传输.

int sigwait(const sigset_t * set,int * sig)

挂起线程,等待集合中指定的信号之一到达,然后将到达的信号存储在* sig中. POSIX标准建议在调用sigwait()等待信号之前,进程中的所有线程都应屏蔽该信号,以确保只有sigwait()的调用者才能获取该信号. 因此,对于需要等待同步的异步信号,它们应该始终为. 在创建任何线程之前,调用pthread_sigmask()来屏蔽该信号的处理. 此外,在调用sigwait()的过程中,最初附加到该信号的信号处理函数不会被调用.

如果在等待期间收到取消信号,则等待立即退出,这意味着sigwait()被实现为取消点.

五种其他同步方法

除了上面讨论的同步方法外,许多其他进程间通信方法也可用于LinuxThreads,例如基于文件系统的IPC(管道,Unix域套接字等),消息队列(Sys.V或Posix),System V信号灯等. 只有一件事要注意,LinuxThreads在内核中被视为独立的进程,作为共享存储区,共享文件系统属性,共享信号处理和共享文件描述符.

六,条件变量,互斥量和信号量之间的区别

1). 互斥锁必须始终由锁定它的线程解锁,并且不必通过执行其等待操作的同一进程来执行信号量的挂起. 一个线程可以等待给定的信号量,而另一个线程可以挂出该信号量.

2). 互斥锁处于锁定状态或未锁定状态(二进制状态,键入二进制信号量)

3). 由于信号灯具有与其关联的状态(其计数值),因此始终会记住信号灯挂起操作. 但是,在将信号发送到条件变量时,如果没有线程在等待条件变量,则该信号将丢失.

4). 互斥锁设计用于锁定,条件变量设计用于等待. 信号量可用于锁定或等待,这可能导致更多的开销和更高的复杂性. 性.

原始博客文章:


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-184064-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 胡夫人
      胡夫人

      是不是收入越低

      • 闫巧云
        闫巧云

        霉菌给了中国加大岛礁建设的绝佳良机

    热点图片
    拼命载入中...