歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux基礎編程 多線程同步 pthread_cond_signal

Linux基礎編程 多線程同步 pthread_cond_signal

日期:2017/3/1 10:17:13   编辑:Linux編程

條件變量同步鎖示例

此例根據上一篇文章修改 (見 http://www.linuxidc.com/Linux/2012-07/65030.htm )

請包含上一篇中的兩個文件(未做任何改動)

1/ pthread_mutex.h

2/ pthread_mutex.c

上一篇的thread.c文件修改如下

  1. /*
  2. 多線程同步示例,條件變量同步鎖
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. #include <pthread.h>
  8. #include "pthread_mutex.h"
  9. #define __DEBUG
  10. #ifdef __DEBUG
  11. #define DBG(fmt,args...) fprintf(stdout, fmt, ##args)
  12. #else
  13. #define DBG(fmt,args...)
  14. #endif
  15. #define ERR(fmt,args...) fprintf(stderr, fmt, ##args)
  16. static int isThreadQuit = 0;
  17. SemHandl_t gHndlSem = NULL;
  18. /*條件變量同步鎖*/
  19. pthread_cond_t gNoneZero;
  20. unsigned int gCount = 0;//條件變量
  21. /*
  22. 某設備寫操作,不同同時訪問,所以所以需要線程鎖保護
  23. 1、將函數DeviceWrite中加鎖
  24. 2、在訪問DeviceWrite的線程中加鎖
  25. 以上兩種方法跟據需要選擇其一。
  26. 本例中在訪問的線程中加鎖
  27. */
  28. void DeviceWrite(char *str)
  29. {
  30. /*SemWait(gHndlSem);*/
  31. DBG("Device Write: %s\n",str);
  32. /*SemRelease(gHndlSem);*/
  33. }
  34. void SetXxThreadQuit()
  35. {
  36. /*quit*/
  37. isThreadQuit = 1;
  38. }
  39. void *XxManageThread(void *arg)
  40. {
  41. char *cmd = (char*)arg;
  42. DBG("arg value=%s\n",cmd);
  43. while(isThreadQuit==0){
  44. SemWait(gHndlSem);// 1、先鎖定
  45. while(gCount==0){// 2、判斷條件變量
  46. pthread_cond_wait(&gNoneZero,gHndlSem);// 3、如果滿足,等待
  47. }
  48. gCount = gCount-1;// 4、條件變量做相應調整
  49. DBG("gCount=%d\n",gCount);
  50. SemRelease(gHndlSem); // 5、開鎖
  51. sleep(1);
  52. }
  53. /*arg是將指針帶進來,cmd則相反,或者設置 NULL*/
  54. pthread_exit(cmd);
  55. //pthread_exit(NULL);
  56. }
  57. void *XxManageThreadMutex(void *arg)
  58. {
  59. char *cmd = (char*)arg;
  60. DBG("arg value=%s\n",cmd);
  61. while(isThreadQuit==0){
  62. SemWait(gHndlSem);
  63. if(gCount == 0){
  64. pthread_cond_signal(&gNoneZero);
  65. }
  66. gCount = gCount+1;
  67. DBG("gCount=%d\n",gCount);
  68. SemRelease(gHndlSem);
  69. sleep(1);
  70. }
  71. /*arg是將指針帶進來,cmd則相反,或者設置 NULL*/
  72. pthread_exit(cmd);
  73. //pthread_exit(NULL);
  74. }
  75. int XxManageThreadInit()
  76. {
  77. pthread_t tManageThread;
  78. pthread_t tManageThreadMutex;
  79. char *any="any value";
  80. char *retn;
  81. int ret;
  82. /*
  83. 第二個參數是設置線程屬性,一般很少用到(設置優先級等),第四個參數為傳遞到線程的指針,
  84. 可以為任何類型
  85. */
  86. ret = pthread_create(&tManageThread,NULL,XxManageThread,"1 thread");
  87. if(ret == -1){
  88. /*成功返回0.失敗返回-1*/
  89. ERR("Ctreate Thread ERROR\n");
  90. return -1;
  91. }
  92. ret = pthread_create(&tManageThreadMutex,NULL,XxManageThreadMutex,"2 thread");
  93. if(ret == -1){
  94. /*成功返回0.失敗返回-1*/
  95. ERR("Ctreate Thread ERROR\n");
  96. return -1;
  97. }
  98. /*
  99. 設置線程退出時資源的清理方式,如果是detach,退出時會自動清理
  100. 如果是join,則要等待pthread_join調用時才會清理
  101. */
  102. pthread_detach(tManageThread);
  103. pthread_detach(tManageThreadMutex);
  104. //pthread_join(tManageThread,retn);
  105. //DBG("retn value=%s\n",retn);
  106. return 0;
  107. }
  108. #define TEST_MAIN
  109. #ifdef TEST_MAIN
  110. int main()
  111. {
  112. printf("hello liuyu\n");
  113. int count=3;
  114. /*創建線程鎖*/
  115. gHndlSem = MakeSem();
  116. if(gHndlSem == NULL){
  117. return -1;
  118. }
  119. /*條件變量同步鎖初始化*/
  120. pthread_cond_init(&gNoneZero,NULL);
  121. if(XxManageThreadInit()==-1){
  122. exit(1);
  123. }
  124. while(count--){
  125. DBG("[0] main running\n");
  126. sleep(2);
  127. }
  128. SetXxThreadQuit();
  129. /*等待線程結束*/
  130. sleep(1);
  131. /*刪除條件變量同步鎖*/
  132. pthread_cond_destroy(&gNoneZero);
  133. /*刪除線程鎖*/
  134. DestroySem(gHndlSem);
  135. DBG("waitting thread exit...\n");
  136. return 0;
  137. }
  138. #endif
Copyright © Linux教程網 All Rights Reserved