Posix跨进程mutex的问题

来源:互联网 发布:搭建网络缓存服务器 编辑:程序博客网 时间:2024/05/24 16:16
例子如下:

#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>

int main()
{
 pthread_mutex_t *mutex;
 pthread_mutexattr_t attr;
 int fd;

 fd = open("mutex", O_RDWR|O_CREAT);
 mutex = mmap(NULL, sizeof(pthread_mutex_t), PROT_READ|PROT_WRITE,
MAP_SHARED, fd, 0);

 pthread_mutexattr_init(&attr);
 pthread_mutexattr_setpshared(
&attr, PTHREAD_PROCESS_SHARED);
 pthread_mutex_init(mutex, &attr);
 pthread_mutexattr_destroy(&attr);

 pthread_mutex_destroy(mutex);
 munmap(mutex, sizeof(pthread_mutex_t));
 close(fd);

 return 0;
}

程序在linux下运行的时候,pthread_mutex_init()会触发一个SIGBUS信号。《Unix Network
Programming》给出的例子是用/dev/zero, 大家知道原因么?linux下多进程共享内存同步有什么更好的方法么?


--~--~---------~--~----~------------~-------~--~----~
 高性能网络编程
 http://groups.google.com/group/dev4server
-~----------~----~----~----~------~----~------~--~---

Reply
 
Forward
 
Invite Peng to chat
 
lau stephen to dev4server
show details 12:40 PM (10 hours ago)
Reply
 
http://www.linuxsir.org/bbs/thread55666.html

4.1.2 进程共享的互斥、条件和信号量
为什么Linux线程没有实现进程共享的互斥、条件和信号量?
这是POSIX标准的一个可选部分。可移植的程序在使用此机制之前
必需检查宏
_POSIX_THREAD_PROCESS_SHARED是否存在。
该扩展标准的目的是使不同的进程(也就是说在不同的地址空间中)可以通过
在共享内存(无论是SRV4的共享内存段还是用mmfile()产生的内存文件)中的
互斥、条件和信号量来实现进程间的同步。
在Linux线程中没有实现此功能的原因是在Linux中互斥、条件和信号并不是独
立的:它们的等待队列包含着指向线程描述符连接表的指针,而这些指针只在
特定的地址空间才有效。
Matt Messier和Sean Walton花了相当长的时间来设计一个在进程间共享等待队
列的适合的机制。我们得到了数个可以将下列三项特点中的两项结合起来的解决
方案,但没有一个可以将三者结合起来:
* 允许不同UID的进程之间的共享;
* 支持取消操作;
* 支持pthread_cond_timedwait
由此我们知道进程间共享互斥、条件和信号量需要内核的某些支持(而目前并不
支持)。这也许是Linus Torvalds的直觉"在内核中我们只需要clone()"的失败
之处之一。
在内核提供对它们的支持之前,你最好使用传统的进程间通讯方式来同步进程:
SYSTEM V信号量和消息队列,或管道或SOCKETS。


> a[sizeof(pthread_mutex_t)];没什么区别。
参加《Unix网络编程》卷一

> 进程间互斥有很多方法
> 如果仅仅是传递数据,使用FIFO就比较合适。FIFO提供了简单的进程间互斥的方式。
我需要实现类似apache scoreboard的东西,mmap感觉更适合



不知道准备用什么方式来实现 worker mpm ?

之前实现过一个类似的进程池的库,也包含了这样一个 worker mpm 。

http://code.google.com/p/spprocpool/

包含了 3 个不同的模型
1. worker mpm
2. 多进程使用 leader/follower 模型进行 accept
3. 父进程 accept,通过 send_fd / recv_fd 传递句柄模型


Best regards,

stephen.nil
2008-05-07