经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
使用 Mutex 实现进程间同步
来源:cnblogs  作者:Lance#  时间:2018/9/25 20:32:55  对本文有异议

我们知道 Mutex 互斥量是可以用在线程间同步的,线程之间共享进程的数据,mutex 就可以直接引用。而进程有自己独立的内存空间,要怎样将它应用在进程间同步呢?为了达到这一目的,可以在 pthread_mutex_init 初始化之前,修改其属性为进程间共享,并将其映射到共享内存中即可。


使用到的API:

  1. pthread_mutexattr_t mattr 类型: 用于定义互斥量的属性
  2. pthread_mutexattr_init 函数: 初始化一个mutex属性对象
  3. pthread_mutexattr_destroy 函数: 销毁 mutex 属性对象
  4. pthread_mutexattr_setpshared 函数: 修改 mutex 属性。

pthread_mutexattr_setpshared 函数使用:

  1. int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);
  2. pshared 参数:它有以下两个取值:
  3. 线程锁:PTHREAD_PROCESS_PRIVATE (mutex的默认属性即为线程锁,进程间私有)
  4. 进程锁:PTHREAD_PROCESS_SHARED
  5. 要想实现进程间同步,需要将 mutex 的属性改为 PTHREAD_PROCESS_SHARED

应用实例:

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <pthread.h>
  4. #include <sys/mman.h>
  5. #include <sys/wait.h>
  6. /* 定义 mutex */
  7. pthread_mutex_t mutex;
  8. pthread_mutexattr_t mutexattr;
  9. int main()
  10. {
  11. int i = 0;
  12. pid_t pid;
  13. pthread_mutex_t *m_mutex;
  14. /* mutex attr 初始化 */
  15. pthread_mutexattr_init(&mutexattr);
  16. /* 修改属性 */
  17. pthread_mutexattr_setpshared(&mutexattr, PTHREAD_PROCESS_SHARED);
  18. /* mutex 初始化 */
  19. pthread_mutex_init(&mutex, &mutexattr);
  20. /* 将 mutex 共享 */
  21. m_mutex = (pthread_mutex_t*) mmap(NULL, sizeof(mutex), PROT_READ|PROT_WRITE,
  22. MAP_SHARED|MAP_ANON, -1, 0);
  23. pid = fork();
  24. if(pid == 0){
  25. for(; i<3; i++){
  26. sleep(1);
  27. pthread_mutex_lock(m_mutex);
  28. puts("This is the child process!");
  29. pthread_mutex_unlock(m_mutex);
  30. }
  31. }else if(pid > 0){
  32. for(; i<3; i++){
  33. sleep(1);
  34. pthread_mutex_lock(m_mutex);
  35. puts("This is the parent process!");
  36. pthread_mutex_unlock(m_mutex);
  37. }
  38. /* 回收子进程资源 */
  39. wait(NULL);
  40. }
  41. /* 销毁 mutex */
  42. pthread_mutexattr_destroy(&mutexattr);
  43. pthread_mutex_destroy(&mutex);
  44. /* 取消映射 */
  45. munmap(m_mutex, sizeof(mutex));
  46. return 0;
  47. }

运行结果:

  1. [root@localhost 24th_processSync]# ./a.out
  2. This is the parent process!
  3. This is the child process!
  4. This is the parent process!
  5. This is the child process!
  6. This is the parent process!
  7. This is the child process!
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号