关闭

Linux互斥锁和条件变量

标签: C++多线程互斥锁条件变量
623人阅读 评论(0) 收藏 举报
分类:
#include <pthread.h>

class thread_lock
{
public:
	thread_lock()
	{
		pthread_mutexattr_init(&m_mutexatr);
//互斥锁重复上锁,不会引起死锁,一个线程对这类互斥锁的多次重复上锁必须由这个线程来重复相同数量的解锁,这样才能解开这个互斥锁,别的线程才能//得到这个互斥锁
		pthread_mutexattr_settype(&m_mutexatr, PTHREAD_MUTEX_RECURSIVE);
		pthread_mutex_init(&m_mutex, &m_mutexatr);
		pthread_cond_init(&m_cond, NULL);
	}

	~thread_lock()
	{
		pthread_mutexattr_destroy(&m_mutexatr);
		pthread_mutex_destroy(&m_mutex);
		pthread_cond_destroy(&m_cond);
	}
	
	void lock()
	{
		pthread_mutex_lock(&m_mutex);
	}

	void unlock()
	{
		pthread_mutex_unlock(&m_mutex);
	}

	void wait()
	{
		pthread_cond_wait(&m_cond, &m_mutex);
	}

	void signal()
	{
		pthread_cond_signal(&m_cond);
	}

private:
	pthread_mutex_t m_mutex;
	pthread_mutexattr_t m_mutexatr;
	pthread_cond_t m_cond;
};

#endif
void read()
{
	while (true)
	{
		m_thread_lock.lock();
		if (m_list_task.empty())
		{
			m_thread_lock.wait();
		}
		task* ptask = m_list_task.front();
		m_list_task.pop_front();
		m_thread_lock.unlock();
		ptask->run();
		delete ptask;
	}
}

void write(task* ptask)
{
	m_thread_lock.lock();
	m_list_task.push_back(ptask);
	m_thread_lock.signal();
	m_thread_lock.unlock();
}

刚开始使用条件变量的时候,一直都在想如果在read函数中m_thread_lock.wait()阻塞住了等待新的数据,那么另外的写线程在write中没法m_thread_lock.lock(),那么就没法发送m_thread_lock.signal(),也就是没法触发read县城了,就会造成永远阻塞的结果了。读了多线程手册才发现,pthread_cond_wait的实际作用。

线程调用pthread_cond_wait这个函数之后,内核会做下面这些事:
1. 拿到锁的线程,把锁暂时释放;
2. 线程休眠,进行等待;
3. 线程等待通知,要醒来。(重新获取锁)
线程库将上面三步做成了原子性操作,和Linux内核绑定在一起。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

为什么有了互斥锁还要条件变量(二者的不同)

一。互斥量和条件变量简介 互斥量(mutex)从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁以后,任何其他试图再次对互斥锁加锁的线...
  • championhengyi
  • championhengyi
  • 2016-08-04 15:58
  • 721

何时使用条件变量? 我们有互斥锁不是就够了么?

先来看看两者的概念: 互斥锁(英语:英语:Mutual exclusion,缩写 Mutex)是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制。 条件变量是利用线...
  • huai1693838234
  • huai1693838234
  • 2015-08-17 19:46
  • 1192

使用条件变量时为啥一定要指定一个锁?

今天看代码的时候突然发现了这个问题。 条件变量wait的时候必须指定一个已经get到了的锁。 去网上搜了一下发现至少是中文范围内,全网都不知道为什么。后来我想了一下,应该是这样的。先看使用情景。 ...
  • madbunny
  • madbunny
  • 2016-04-28 01:34
  • 2337

C++互斥锁与条件变量的封装使用

互斥锁类的封装:#ifndef _MUTEXLOCK_H #define _MUTEXLOCK_H#include #include class MutexLock { friend cla...
  • y396397735
  • y396397735
  • 2016-06-28 22:09
  • 524

pthread几个互斥锁和条件变量接口

pthread_cleanup_push/pthread_cleanup_pop: pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut)...
  • hui6075
  • hui6075
  • 2016-04-16 17:46
  • 405

关于条件变量和互斥锁为何配合使用的思考

最近在阅读《现代操作系统》,看到条件变量部分时非常疑惑条件变量为什么需要互斥锁,书上也没有非常明显解说原因(其实有说,但是我看书不仔细),查阅了一些资料,进行了一些思考。   我的疑惑点在于条件变量为...
  • zrf2112
  • zrf2112
  • 2016-08-23 09:29
  • 1110

为什么一个条件变量要用互斥变量来保护

======================== ======================== 内的内容为网上的分析 =====================================...
  • mooncake1012
  • mooncake1012
  • 2016-11-08 09:57
  • 134

信号量、互斥锁,读写锁和条件变量的区别

原文地址:信号量、互斥锁,读写锁和条件变量的区别 作者:qqrilxk 信号量强调的是线程(或进程)间的同步:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉...
  • weiyuefei
  • weiyuefei
  • 2015-12-27 18:16
  • 2980

互斥锁、条件变量:生产者消费者问题

生产者消费者问题是一个经典的同步问题,相信学习过操作系统的同学都接触过。这里总结一下《UNP vol2》中关于该问题的知识。互斥锁、条件变量 可以用于线程间同步,可以用于进程将同步(需要将互斥锁、条件...
  • chj90220
  • chj90220
  • 2016-05-12 14:51
  • 884

Linux多线程消费者和生产者模型实例(互斥锁和条件变量使用)

条件变量与互斥锁使用,生产者和消费者模型
  • Linux_ever
  • Linux_ever
  • 2015-12-08 11:41
  • 2704