我是靠谱客的博主 朴实黑夜,最近开发中收集的这篇文章主要介绍linux基础编程 多线程中的互斥锁 pthread_mutex_lock,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

pthread_mutex.h头文件

[cpp]  view plain copy
  1. #ifndef __SEM_UTIL_H__  
  2. #define __SEM_UTIL_H__  
  3.   
  4. typedef void* SemHandl_t;  
  5.   
  6. SemHandl_t MakeSem(); ///< Initialize the semaphore.  
  7. int SemRelease(SemHandl_t hndlSem); ///< Unlock the semaphore.  
  8. int SemWait(SemHandl_t hndlSem); ///< Lock the semaphore.  
  9. int DestroySem(SemHandl_t hndlSem); ///< Destory the semaphore.  
  10.   
  11.   
  12. #endif  

pthread_mutex.c源文件

[cpp]  view plain copy
  1. /* 
  2. 互斥锁用来保证一段时间内只有一个线程在执行一段代码。 
  3. 必要性显而易见:假设各个线程向同一个文件顺序写入数据, 
  4. 最后得到的结果一定是灾难性的。 
  5. */  
  6. #include <stdio.h>  
  7. #include <stdlib.h>  
  8. #include <unistd.h>  
  9. #include <pthread.h>  
  10.   
  11. #include "pthread_mutex.h"  
  12.   
  13. #define __DEBUG  
  14. #ifdef __DEBUG  
  15. #define DBG(fmt,args...) fprintf(stdout,  fmt,  ##args)  
  16. #else  
  17. #define DBG(fmt,args...)  
  18. #endif  
  19. #define ERR(fmt,args...) fprintf(stderr,  fmt,  ##args)  
  20.   
  21. /*线程互斥锁初始化*/  
  22. SemHandl_t MakeSem()  
  23. {  
  24.     SemHandl_t hndlSem = malloc(sizeof(pthread_mutex_t));  
  25.     if(hndlSem == NULL){  
  26.         ERR("Not enough memory!!n");  
  27.         return NULL;  
  28.     }  
  29.     /* Initialize the mutex which protects the global data */  
  30.     if(pthread_mutex_init(hndlSem, NULL) != 0){  
  31.         ERR("Sem init faill!!n");  
  32.         free(hndlSem);  
  33.         return NULL;  
  34.     }  
  35.     return hndlSem;  
  36. }  
  37.   
  38. /*线程互斥锁释放*/  
  39. int SemRelease(SemHandl_t hndlSem)  
  40. {  
  41.     if(hndlSem == NULL){  
  42.         ERR("SemRelease: Invalid Semaphore handlern");  
  43.         return -1;  
  44.     }  
  45.     return pthread_mutex_unlock(hndlSem);  
  46. }  
  47.   
  48. /*等待*/  
  49. int SemWait(SemHandl_t hndlSem)  
  50. {  
  51.     if(hndlSem == NULL){  
  52.         ERR("SemWait: Invalid Semaphore handlern");  
  53.         return -1;  
  54.     }  
  55.     return pthread_mutex_lock(hndlSem);  
  56. }  
  57.   
  58. /*删除*/  
  59. int DestroySem(SemHandl_t hndlSem)  
  60. {  
  61.     if(hndlSem == NULL){  
  62.         ERR("DestroySem: Invalid Semaphore handlern");  
  63.         return -1;  
  64.     }  
  65.     pthread_mutex_lock(hndlSem);  
  66.     pthread_mutex_unlock(hndlSem);  
  67.     if(pthread_mutex_destroy(hndlSem) !=0){  
  68.         ERR("Sem_kill faill!!n");  
  69.     }  
  70.     free(hndlSem);  
  71.     return 0;  
  72. }  

有了以上基础就可以再多线程中测试了,下面的代码是在上篇文章的基础上修改的

thread.c 源文件

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <unistd.h>  
  4. #include <pthread.h>  
  5.   
  6. #include "pthread_mutex.h"  
  7.   
  8. #define __DEBUG  
  9. #ifdef __DEBUG  
  10. #define DBG(fmt,args...) fprintf(stdout,  fmt,  ##args)  
  11. #else  
  12. #define DBG(fmt,args...)  
  13. #endif  
  14. #define ERR(fmt,args...) fprintf(stderr,  fmt,  ##args)  
  15.   
  16. static int isThreadQuit = 0;  
  17. SemHandl_t gHndlSem = NULL;  
  18.   
  19. /* 
  20. 某设备写操作,不同同时访问,所以所以需要线程锁保护 
  21. 1、将函数DeviceWrite中加锁 
  22. 2、在访问DeviceWrite的线程中加锁 
  23. 以上两种方法跟据需要选择其一。 
  24. 本例中在访问的线程中加锁 
  25. */  
  26. void DeviceWrite(char *str)  
  27. {  
  28.     /*SemWait(gHndlSem);*/  
  29.     DBG("Device Write: %sn",str);  
  30.     /*SemRelease(gHndlSem);*/  
  31. }  
  32. void SetXxThreadQuit()  
  33. {     
  34.     /*quit*/  
  35.     isThreadQuit = 1;  
  36. }  
  37. void *XxManageThread(void *arg)  
  38. {  
  39.     char *cmd = (char*)arg;  
  40.     DBG("arg value=%sn",cmd);  
  41.     while(isThreadQuit==0){  
  42.         SemWait(gHndlSem);  
  43.         DeviceWrite("thread 1");  
  44.         SemRelease(gHndlSem);  
  45.         sleep(1);  
  46.     }  
  47.     /*arg是将指针带进来,cmd则相反,或者设置 NULL*/  
  48.     pthread_exit(cmd);  
  49.     //pthread_exit(NULL);  
  50. }  
  51. void *XxManageThreadMutex(void *arg)  
  52. {  
  53.     char *cmd = (char*)arg;  
  54.     DBG("arg value=%sn",cmd);  
  55.     while(isThreadQuit==0){  
  56.         SemWait(gHndlSem);  
  57.         DeviceWrite("thread 2");  
  58.         SemRelease(gHndlSem);  
  59.         sleep(1);  
  60.     }  
  61.     /*arg是将指针带进来,cmd则相反,或者设置 NULL*/  
  62.     pthread_exit(cmd);  
  63.     //pthread_exit(NULL);  
  64. }  
  65.   
  66. int XxManageThreadInit()  
  67. {  
  68.     pthread_t tManageThread;  
  69.     pthread_t tManageThreadMutex;  
  70.       
  71.     char *any="any value";  
  72.     char *retn;  
  73.     int ret;  
  74.     /* 
  75.       第二个参数是设置线程属性,一般很少用到(设置优先级等),第四个参数为传递到线程的指针, 
  76.       可以为任何类型 
  77.     */  
  78.     ret = pthread_create(&tManageThread,NULL,XxManageThread,"1 thread");  
  79.     if(ret == -1){  
  80.         /*成功返回0.失败返回-1*/  
  81.         ERR("Ctreate Thread ERRORn");  
  82.         return -1;  
  83.     }  
  84.   
  85.     ret = pthread_create(&tManageThreadMutex,NULL,XxManageThreadMutex,"2 thread");  
  86.     if(ret == -1){  
  87.         /*成功返回0.失败返回-1*/  
  88.         ERR("Ctreate Thread ERRORn");  
  89.         return -1;  
  90.     }  
  91.       
  92.     /* 
  93.       设置线程退出时资源的清理方式,如果是detach,退出时会自动清理 
  94.       如果是join,则要等待pthread_join调用时才会清理 
  95.     */  
  96.     pthread_detach(tManageThread);  
  97.     pthread_detach(tManageThreadMutex);  
  98.     //pthread_join(tManageThread,retn);  
  99.     //DBG("retn value=%sn",retn);  
  100.     return 0;  
  101. }  
  102.   
  103. #define TEST_MAIN  
  104. #ifdef TEST_MAIN  
  105. int main()  
  106. {  
  107.     printf("hello liuyun");  
  108.     int count=3;  
  109.     /*创建线程锁*/  
  110.     gHndlSem = MakeSem();  
  111.     if(gHndlSem == NULL){  
  112.         return -1;  
  113.     }  
  114.       
  115.     if(XxManageThreadInit()==-1){  
  116.         exit(1);  
  117.     }  
  118.       
  119.     while(count--){  
  120.         DBG("[0] main runningn");  
  121.         sleep(2);  
  122.     }  
  123.       
  124.     SetXxThreadQuit();  
  125.     /*等待线程结束*/  
  126.     sleep(1);  
  127.     /*删除线程锁*/  
  128.     DestroySem(gHndlSem);  
  129.     DBG("waitting thread exit...n");  
  130.     return 0;  
  131. }  
  132. #endif  

最后

以上就是朴实黑夜为你收集整理的linux基础编程 多线程中的互斥锁 pthread_mutex_lock的全部内容,希望文章能够帮你解决linux基础编程 多线程中的互斥锁 pthread_mutex_lock所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部