信号量 互斥锁 条件变量的区别

互斥锁

pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
或
pthread_mutex_t mutex;
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
int pthread_mutex_lock(pthread_mutex_t *mutex)
int pthread_mutex_unlock(pthread_mutex_t *mutex)
int pthread_mutex_trylock(pthread_mutex_t *mutex)


信号量

sem_t sem_event;
int sem_init(sem_t *sem, int pshared, unsigned int value) 
int sem_destroy(sem_t * sem) 
int sem_post(sem_t * sem)
int sem_wait(sem_t * sem)
int sem_trywait(sem_t * sem)
int sem_getvalue(sem_t * sem, int * sval)


条件变量

pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
或
pthread_cond_t cond;
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr)
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t 
*mutex, const struct timespec *abstime)
pthread_cond_signal()

互斥锁没什么好说的。成对出现。

关键是信号量和条件变量的使用场合。

以下两篇文章。

1:讲述:基本定义和用法

Posix线程编程指南(3)

http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part3/

2:一篇博客讲解区别

http://www.cnblogs.com/lonelycatcher/archive/2011/12/20/2294161.html

根据第二个博客的理解应该是:

线程同步:何时互斥锁不够,还需要条件变量?

假设有共享的资源sum,与之相关联的mutex 是lock_s.假设每个线程对sum的操作很简单的,与sum的状态无关,比如只是sum++.

那么只用mutex足够了.程序员只要确保每个线程操作前,取得lock,然后sum++,再unlock即可.简单的理解是,资源是很纯粹的,

没有顺序上的概念。

 

再看信号灯和条件变量

一般的生产者和消费者模型下,比如一个队列。还是应该使用信号灯,因为,信号灯是计数器,这样队列便可长可短。

但是如果涉及到某个条件的控制或者检测,而不想用sleep的方法,顾名思义,就应当使用条件变量。

 

内容概要:本文详细介绍了Linux系统编程中的线程同步机制,涵盖同步的基本概念及其在编程中的具体实现。文章首先解释了同步的概念,即确保多个控制流在操作共享资源时按预定顺序执行,避免数据混乱。接着深入探讨了互斥量(mutex)、读写锁(read-write lock)、条件变量(condition variable)以及信号量(semaphore)四种主要的线程同步工具,包括它们的工作原理、应用场景及相关的API函数。文中通过多个实例演示了如何利用这些工具解决实际问题,如经典的生产者消费者模型。此外,还讨论了死锁现象及其产生原因,并提供了相应的预防措施。 适合人群:有一定编程经验,尤其是对Linux系统编程感兴趣的开发者;从事多线程编程工作的软件工程师。 使用场景及目标:①理解线程同步的重要性及其实现方式;②掌握互斥量、读写锁、条件变量信号量的具体用法;③学会识别并解决多线程编程中可能出现的数据竞争和死锁问题;④提高多线程应用程序的性能和可靠性。 其他说明:阅读时建议结合实际代码进行练习,加深对各同步机制的理解。对于互斥量、读写锁等工具,要注意锁的粒度尽量小,以减少不必要的阻塞。同时,条件变量可以有效减少线程间的无效竞争,而信号量则提供了比互斥锁更灵活的资源管理方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值