Chinaunix

标题: Linux下使用pthread_mutex_t同步进程的问题 [打印本页]

作者: 精简指令    时间: 2006-08-09 22:40
标题: Linux下使用pthread_mutex_t同步进程的问题
环境:
$ 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 编辑 ]
作者: huaxue    时间: 2006-08-10 16:09
如果不设置PTHREAD_PROCESS_SHARED属性,系统应该默认值就是PTHREAD_PROCESS_PRIVATE。
pthread_mutex_t是互斥锁,在临界区域只能有一个线程(我想这里可能对进程也适用吧)可以操作。

不知道以上的理解是否正确?
作者: 精简指令    时间: 2006-08-10 22:48
我的理解是,设置SHARED属性后,pthread_mutex_t可以用于同步进程。

但是在上面的环境中测试的结果与此不符。我不知道是什么原因造成的。
作者: Alligator27    时间: 2006-08-11 21:46
原帖由 精简指令 于 2006-8-10 22:48 发表
我的理解是,设置SHARED属性后,pthread_mutex_t可以用于同步进程。

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

linux 的文档说, 设置PTHREAD_PROCESS_PRIVATE, 但用于别的进程中, 是undefined. 当然有可能是你看到的结果.
作者: 精简指令    时间: 2006-08-15 22:52
谢谢:)

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

[ 本帖最后由 精简指令 于 2006-8-15 23:26 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2