免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 14505 | 回复: 4
打印 上一主题 下一主题

Linux下使用pthread_mutex_t同步进程的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-09 22:40 |只看该作者 |倒序浏览
环境:
$ getconf GNU_LIBPTHREAD_VERSION
NPTL 2.3.4

$ uname -r
2.6.9-5.ELsmp

问题:
我设置了PTHREAD_PROCESS_PRIVATE属性,但是依然可以在父进程和子进程之间同步。
另外,不设置PTHREAD_PROCESS_SHARED属性,也可以在父进程和子进程之间同步。
是不是我对mutex属性的理解有问题?还是NPTL就是这样支持的呢?

测试程序:



  1. #include <sys/types.h>
  2. #include <sys/ipc.h>
  3. #include <sys/shm.h>
  4. #include <sys/wait.h>
  5. #include <unistd.h>
  6. #include <pthread.h>
  7. #include <stdio.h>

  8. int main(int argc, char** argv)
  9. {
  10.     int ipc_key = 0x11223344;

  11.     int shmid = shmget(ipc_key, sizeof(pthread_mutex_t), IPC_CREAT | 0666);
  12.     if(shmid < 0)
  13.     {
  14.         printf("shmget error\n");
  15.         return -1;
  16.     }

  17.     pthread_mutex_t* mutex = (pthread_mutex_t*)shmat(shmid, NULL, 0);
  18.     if(mutex == (pthread_mutex_t*)-1)
  19.     {
  20.         printf("shmat error\n");
  21.         return -1;
  22.     }

  23.     pthread_mutexattr_t attr;
  24.     pthread_mutexattr_init(&attr);
  25.     pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_PRIVATE);

  26.     pthread_mutex_init(mutex, &attr);

  27.     pid_t pid = fork();

  28.     if(pid == 0)
  29.     {
  30.         pthread_mutex_lock(mutex);
  31.         printf("PID: %d\n", pid);
  32.         sleep(5);
  33.         pthread_mutex_unlock(mutex);

  34.         return 0;
  35.     }

  36.     pthread_mutex_lock(mutex);
  37.     printf("PID: %d\n", pid);
  38.     sleep(5);
  39.     pthread_mutex_unlock(mutex);

  40.     waitpid(pid, NULL, 0);

  41.     shmctl(shmid, IPC_RMID, 0);
  42.     return 0;
  43. }
复制代码

[ 本帖最后由 精简指令 于 2006-8-9 22:51 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-08-10 16:09 |只看该作者
如果不设置PTHREAD_PROCESS_SHARED属性,系统应该默认值就是PTHREAD_PROCESS_PRIVATE。
pthread_mutex_t是互斥锁,在临界区域只能有一个线程(我想这里可能对进程也适用吧)可以操作。

不知道以上的理解是否正确?

论坛徽章:
0
3 [报告]
发表于 2006-08-10 22:48 |只看该作者
我的理解是,设置SHARED属性后,pthread_mutex_t可以用于同步进程。

但是在上面的环境中测试的结果与此不符。我不知道是什么原因造成的。

论坛徽章:
0
4 [报告]
发表于 2006-08-11 21:46 |只看该作者
原帖由 精简指令 于 2006-8-10 22:48 发表
我的理解是,设置SHARED属性后,pthread_mutex_t可以用于同步进程。

但是在上面的环境中测试的结果与此不符。我不知道是什么原因造成的。

linux 的文档说, 设置PTHREAD_PROCESS_PRIVATE, 但用于别的进程中, 是undefined. 当然有可能是你看到的结果.

论坛徽章:
0
5 [报告]
发表于 2006-08-15 22:52 |只看该作者
谢谢:)

以前的版本太老了,没有man到这部分内容。

[ 本帖最后由 精简指令 于 2006-8-15 23:26 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP