Linux互斥锁和条件变量

原创 2016年07月29日 15:30:25
#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内核绑定在一起。

版权声明:本文为博主原创文章,如需转载请标明出处链接!否则追究法律责任! https://blog.csdn.net/peng314899581/article/details/52065474

Linux下c++多线程和互斥锁

一、多线程 多线程使用的是pthread库,写程序的时候需要引入头文件pthread.h, g++编译的时候需要加上该库的依赖“-lpthread”。 1 先看程序便于理解,代码下面有对注释的解释...
  • deyuzhi
  • deyuzhi
  • 2016-07-01 11:43:37
  • 1670

Linux平台上用C++实现多线程互斥锁

在上篇用C++实现了Win32平台上的多线程互斥锁,这次写个Linux平台上的,同样参考了开源项目C++ Sockets的代码,在此对这些给开源项目做出贡献的斗士们表示感谢!     下边分别是互斥...
  • chexlong
  • chexlong
  • 2011-12-09 20:14:12
  • 13924

Linux c++互斥锁

#ifndef _Lock_H #define _Lock_H #include #include using namespace std; //锁接口类 class ILoc...
  • a474711079
  • a474711079
  • 2014-06-07 15:38:53
  • 783

Linux多线程——使用信号量同步线程

信号量、同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过是同步的对象不同而已。但是下面介绍的信号量的接口是用于线程的信号量,注意不要跟用于进程间通信的信号量混淆。相似地,线程同步...
  • ljianhui
  • ljianhui
  • 2013-09-01 00:09:38
  • 45645

Linux平台用C++实现信号量,同步线程

Linux平台用C++实现信号量,同步线程     使用Linux平台上现有的信号量sem_t相关的一组API,可以方便地进行线程同步。现在用pthread_mutex_t和...
  • zhu2695
  • zhu2695
  • 2016-04-14 01:20:47
  • 952

C++多线程同步之Semaphore(信号量)

一、线程间同步的几种方式从上篇博文中可以发现,当多个线程对同一资源进行使用时,会产生“争夺”的情况,为了避免这种情况的产生,也就出现了线程间的同步这个技术。线程间的同步有多种方式,在接下来的博文中我会...
  • oLanSeFengYe1
  • oLanSeFengYe1
  • 2016-10-24 16:06:40
  • 2071

Linux 互斥锁、原子操作实现原理

futex(快速用户区互斥的简称)是一个在Linux上实现锁定和构建高级抽象锁如信号量和POSIX互斥的基本工具。它们第一次出现在内核开发的2 5 7版;其语义在2 5 40固定下来,然后在2 6 x...
  • u011244446
  • u011244446
  • 2016-09-18 14:42:26
  • 5068

C++跨平台条件变量和<em>互斥锁</em>封装

用C++封装的跨平台条件变量和互斥量,windows环境和<em>linux</em>环境都测试好用,是理解...c++<em>互斥锁</em> C++并发编程2——为保护数据加锁(一) c<em>+c%2B%2B</em>程序员面试宝典...
  • 2018年04月13日 00:00

Linux互斥锁、条件变量和信号量

  • 2012年12月29日 18:31
  • 38KB
  • 下载

linux互斥锁和条件变量

一、互斥锁 1. 初始化: 在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态分配的互斥量, 可以把它设置为PTHREAD_M...
  • HEYUTAO007
  • HEYUTAO007
  • 2011-07-19 14:20:30
  • 4273
收藏助手
不良信息举报
您举报文章:Linux互斥锁和条件变量
举报原因:
原因补充:

(最多只允许输入30个字)