Linux 线程同步有哪些方法?

 我来答
南葛小子
2017-05-01 · TA获得超过100个赞
知道答主
回答量:49
采纳率:0%
帮助的人:14.1万
展开全部

一、互斥锁(mutex)

  1. 初始化锁。在Linux下,线程的互斥量数据类型是pthread_mutex_t。在使用前,要对它进行初始化。

    静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

    动态分配:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr_t *mutexattr);

  2. 加锁。对共享资源的访问,要对互斥量进行加锁,如果互斥量已经上了锁,调用线程会阻塞,直到互斥量被解锁。

    int pthread_mutex_lock(pthread_mutex *mutex);

    int pthread_mutex_trylock(pthread_mutex_t *mutex);

  3. 解锁。在完成了对共享资源的访问后,要对互斥量进行解锁。

    int pthread_mutex_unlock(pthread_mutex_t *mutex);

  4. 销毁锁。锁在是使用完成后,需要进行销毁以释放资源。

    int pthread_mutex_destroy(pthread_mutex *mutex);

二、条件变量(cond)

  1. 初始化条件变量。

    静态态初始化,pthread_cond_t cond = PTHREAD_COND_INITIALIER;

    动态初始化,int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);

  2. 等待条件成立。释放锁,同时阻塞等待条件变量为真才行。timewait()设置等待时间,仍未signal,返回ETIMEOUT(加锁保证只有一个线程wait)

    int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

    int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);

  3. 激活条件变量。pthread_cond_signal,pthread_cond_broadcast(激活所有等待线程)

    int pthread_cond_signal(pthread_cond_t *cond);

    int pthread_cond_broadcast(pthread_cond_t *cond); //解除所有线程的阻塞

  4. 清除条件变量。无线程等待,否则返回EBUSY

    int pthread_cond_destroy(pthread_cond_t *cond);

三、信号量(sem)

  1. 信号量初始化。

    int sem_init (sem_t *sem , int pshared, unsigned int value);

    这是对由sem指定的信号量进行初始化,设置好它的共享选项(linux 只支持为0,即表示它是当前进程的局部信号量),然后给它一个初始值VALUE。

  2. 等待信号量。给信号量减1,然后等待直到信号量的值大于0。

    int sem_wait(sem_t *sem);

  3. 释放信号量。信号量值加1。并通知其他等待线程。

    int sem_post(sem_t *sem);

  4. 销毁信号量。我们用完信号量后都它进行清理。归还占有的一切资源。

    int sem_destroy(sem_t *sem);

ttqtc
2017-05-01
知道答主
回答量:1
采纳率:0%
帮助的人:1003
展开全部
互斥锁、条件变量、信号量
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式