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

原作者:chexlong 原文地址:http://blog.csdn.net/chexlong/article/details/7058283

在上篇用C++实现了Win32平台上的多线程互斥锁,这次写个Linux平台上的,同样参考了开源项目C++ Sockets的代码,在此对这些给开源项目做出贡献的斗士们表示感谢!

下边分别是互斥锁类和测试代码,已经在Fedora 13虚拟机上测试通过。

Lock.h

[cpp] view plaincopy

  1. #ifndef _Lock_H
  2. #define _Lock_H
  3. #include <pthread.h>
  4. //锁接口类
  5. class ILock
  6. {
  7. public:
  8. virtual ~ILock() {}
  9. virtual void Lock() const = 0;
  10. virtual void Unlock() const = 0;
  11. };
  12. //互斥锁类
  13. class CMutex : public ILock
  14. {
  15. public:
  16. CMutex();
  17. ~CMutex();
  18. virtual void Lock() const;
  19. virtual void Unlock() const;
  20. private:
  21. mutable pthread_mutex_t m_mutex;
  22. };
  23. //锁
  24. class CMyLock
  25. {
  26. public:
  27. CMyLock(const ILock&);
  28. ~CMyLock();
  29. private:
  30. const ILock& m_lock;
  31. };
  32. #endif

Lock.cpp

[cpp] view plaincopy

  1. #include "Lock.h"
  2. //动态方式初始化互斥锁
  3. CMutex::CMutex()
  4. {
  5. pthread_mutex_init(&m_mutex, NULL);
  6. }
  7. //注销互斥锁
  8. CMutex::~CMutex()
  9. {
  10. pthread_mutex_destroy(&m_mutex);
  11. }
  12. //确保拥有互斥锁的线程对被保护资源的独自访问
  13. void CMutex::Lock() const
  14. {
  15. pthread_mutex_lock(&m_mutex);
  16. }
  17. //释放当前线程拥有的锁,以使其它线程可以拥有互斥锁,对被保护资源进行访问
  18. void CMutex::Unlock() const
  19. {
  20. pthread_mutex_unlock(&m_mutex);
  21. }
  22. //利用C++特性,进行自动加锁
  23. CMyLock::CMyLock(const ILock& m) : m_lock(m)
  24. {
  25. m_lock.Lock();
  26. }
  27. //利用C++特性,进行自动解锁
  28. CMyLock::~CMyLock()
  29. {
  30. m_lock.Unlock();
  31. }

测试代码

[cpp] view plaincopy

  1. // pthread_mutex.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include <iostream>
  4. #include <unistd.h>
  5. #include "Lock.h"
  6. using namespace std;
  7. //创建一个互斥锁
  8. CMutex g_Lock;
  9. //线程函数
  10. void * StartThread(void *pParam)
  11. {
  12. char *pMsg = (char *)pParam;
  13. if (!pMsg)
  14. {
  15. return (void *)1;
  16. }
  17. //对被保护资源(以下打印语句)自动加锁
  18. //线程函数结束前,自动解锁
  19. CMyLock lock(g_Lock);
  20. for( int i = 0; i < 5; i++ )
  21. {
  22. cout << pMsg << endl;
  23. sleep( 1 );
  24. }
  25. return (void *)0;
  26. }
  27. int main(int argc, char* argv[])
  28. {
  29. pthread_t thread1,thread2;
  30. pthread_attr_t attr1,attr2;
  31. char *pMsg1 = "First print thread.";
  32. char *pMsg2 = "Second print thread.";
  33. //创建两个工作线程,分别打印不同的消息
  34. pthread_attr_init(&attr1);
  35. pthread_attr_setdetachstate(&attr1,PTHREAD_CREATE_JOINABLE);
  36. if (pthread_create(&thread1,&attr1, StartThread,pMsg1) == -1)
  37. {
  38. cout<<"Thread 1: create failed"<<endl;
  39. }
  40. pthread_attr_init(&attr2);
  41. pthread_attr_setdetachstate(&attr2,PTHREAD_CREATE_JOINABLE);
  42. if (pthread_create(&thread2,&attr2, StartThread,pMsg2) == -1)
  43. {
  44. cout<<"Thread 2: create failed"<<endl;
  45. }
  46. //等待线程结束
  47. void *result;
  48. pthread_join(thread1,&result);
  49. pthread_join(thread2,&result);
  50. //关闭线程,释放资源
  51. pthread_attr_destroy(&attr1);
  52. pthread_attr_destroy(&attr2);
  53. int iWait;
  54. cin>>iWait;
  55. return 0;
  56. }

编译成功后,运行程序

同样,若将下边代码注释掉,重新编译

[cpp] view plaincopy

  1. //CMyLock lock(g_Lock);

运行程序

结果显而易见。

时间: 2024-09-30 15:55:33

【转】Linux平台上用C++实现多线程互斥锁的相关文章

Linux平台上SQLite数据库教程(二)——C语言API介绍

Linux平台上SQLite数据库教程(二)--C语言API介绍 前言:本文将介绍几个基本的SQLite3数据库的C语言API接口,主要用到两个文件:sqlite3.c.sqlite3.h.源码地址:https://github.com/AnSwErYWJ/SQLite. 打开数据库 1.原型: int sqlite3_open( const char* filename, /* 数据库文件名, 必须为 UTF-8 格式 */ sqlite3** ppDB /* 输出: SQLite 数据库句柄

Linux平台上SQLite数据库教程(一)——终端使用篇

Linux平台上SQLite数据库的安装与使用 SQLite是一款轻型的数据库,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,可能只需要几百K的内存就够了.能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl.C#.PHP.Java等,还有ODBC接口. 安装 在终端输入: sudo apt-get install sqlite3 一般系统中自带,不需要手动安装. 我们也可以选择安装图形界面程序,如sql

Linux环境编程之同步(一):互斥锁

同步的内容在<UNP2>里把它看作了进程间通信,我觉得其实同步只是进程间通信的一种协作方式一种协作的手段,不能称之为进程间通信的一种形式,所以标题用了"同步",而没有用IPC进程间通信. 互斥锁是同步的基本组成部分,它们总是用来同步一个进程内的各个线程的.如果互斥锁或条件变量存放在多个进程间共享的某个内存区,那么Posix还允许它用于这些进程间的同步. 互斥锁用于保护临界区以保证任何时刻只有一个线程在执行其中的代码,或者任何时刻只有一个进程在执行其中的代码.保护临界区的代码

Linux组件封装(一)中互斥锁MutexLock的封装

本文对Linux中的pthread_mutex_t做一个简易的封装. 互斥锁主要用于互斥,互斥是一种竞争关系,主要是某一个系统资源或一段代码,一次做多被一个线程访问. 条件变量主要用于同步,用于协调线程之间的关系,是一种合作关系. Linux中互斥锁的用法很简单,最常用的是以下的几个函数: int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); int pthread_mutex_

Linux 线程同步的三种方法(互斥锁、条件变量、信号量)

互斥锁 1 #include <cstdio> 2 3 #include <cstdlib> 4 5 #include <unistd.h> 6 7 #include <pthread.h> 8 9 #include "iostream" 10 11 using namespace std; 12 13 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 14 15 int tmp; 16

在Linux平台上用ASP.NET 5 连接Redis服务器

最近在做一个Linux平台上基于ASP.Net 5 中间件+Redis+Mysql架构的系统,研究使用了 StackExchange.Redis 作为asp.net5连接redis的工具.作者在前几天开了一个新的分支"CoreCLR"开始对asp.net5的进行升级开发.并且有一个pull request跟踪相关的问题.在Windows开发机上测试一切都可以正常执行.迁移到Linux上的Docker容器里执行后发现,asp.net5的中间件程序在通过StackExchange.Redi

Linux平台上apache服务器的搭建和应用

背景 一次偶然的机会,在实验室下载了一部电影<栀子花开>,在实验室看电影肯定不好吧= = 于是就想拷贝到寝室的电脑回去慢慢看,问题是忘带U盘了,这可就愁了.突然想到,可以在实验室搭建一个apache服务器把电影传到上面,回到寝室下载就行了啊.因为ip肯定都是在校园局域网内的,所以能行得通,而且传输速度也会很理想. 搭建服务器 1.安装及搭建 第一步是在实验室的电脑上安装搭建apache服务器,我的笔记本电脑安装了windows和ubuntu双系统,但是我选择系统平台为Ubuntu 14.04L

Linux平台上用C语言实现与MySQL数据库的连接

安装编译工具 ---- 这将安装gcc/g++/gdb/make 等基本编程工具: sudo apt-get install build-essential 输入命令"sudo apt-get install mysql",再连按2下Tab键,目的是查看自己当前的软件源中有关mysql的信息. 我选择安装: sudo apt-get install mysql-server mysql-client 输入命令"sudo apt-get install libmysql&quo

移植iw 到linux平台上。

https://github.com/174high/iw-3.7-Linux-porting https://github.com/174high/libnl-1.1-stable-master-linux-porting 下载到平台上 一.iw 3.7 工具 依赖 libnl-1.1-stable-master 库 I.先编译 libnl-1.1-stable-master 库 命令: #./configure --host=arm-linux --prefix=/home/visteon/