zoukankan      html  css  js  c++  java
  • 【转】Linux平台上用C++实现多线程互斥锁

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

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

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

    Lock.h

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

    Lock.cpp

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

        测试代码

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

        编译成功后,运行程序

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

    1. //CMyLock lock(g_Lock);  

        运行程序

        结果显而易见。

  • 相关阅读:
    Zookeeper_ZAB协议
    Zookeeper_Paxos算法
    Eureka的表兄弟Zookeeper理论基础
    SSE:服务器推送事件
    BIO、NIO、AIO入门认识
    c语言float、double数据保留2位小数
    c语言在8位bmp位图上画一个框并另存
    C语言在24真彩位图上指定位置处画一条横线
    vs2010 opengl 环境搭建
    osg模型操作之替代节点
  • 原文地址:https://www.cnblogs.com/gkwang/p/4482935.html
Copyright © 2011-2022 走看看