首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在试图锁定来自两个不同进程的共享内存时,pthread_mutex_t分段错误?

为什么在试图锁定来自两个不同进程的共享内存时,pthread_mutex_t分段错误?
EN

Stack Overflow用户
提问于 2014-04-02 01:41:34
回答 3查看 1.3K关注 0票数 5

我为pthread_mutex_t编写了一个超级简单的包装器,用于两个进程之间:

代码语言:javascript
运行
复制
//basic version just to test using it between two processes
struct MyLock
{
    public:
        MyLock() {
            pthread_mutexattr_init(&attr);
            pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
            pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ADAPTIVE_NP);

            pthread_mutex_init(&lock, &attr);
        }

        ~MyLock() {
            pthread_mutex_destroy(&lock);
            pthread_mutexattr_destroy(&attr);
        }

        lock() {
            pthread_mutex_lock(&lock);
        }

        unlock() {
            pthread_mutex_unlock(&lock);
        }

    private:
        pthread_mutexattr_t attr;
        pthread_mutex_t lock;
};

我能够看到这个锁在进程中的常规线程之间很好地工作,但是当我运行进程A时,它在共享内存区域执行以下操作:

代码语言:javascript
运行
复制
void* mem; //some shared memory from shm_open
MyLock* myLock = new(mem) MyLock;
//loop sleeping random amounts and calling ->lock and ->unlock

然后进程B打开共享内存对象(通过将其设置为同一内存区域的字符组合来验证它),并执行以下操作:

代码语言:javascript
运行
复制
MyLock* myLock = reinterpret_cast<MyLock*>(mem);
//same loop for locking and unlocking as process A

但是,当试图用反向跟踪锁定时进程B段错误导致了libp线程.so.0中的pthread_mutex_lock()

我做错了什么?

我从进程B得到的回溯如下所示:

代码语言:javascript
运行
复制
in pthread_mutex_lock () from /lib64/libpthread.so.0
in MyLock::lock at MyLock.H:50
in Server::setUpSharedMemory at Server.C:59
in Server::Server at Server.C
in main.C:52

该调用是在重新解释将内存转换为MyLock*后锁定的第一个调用。如果在崩溃过程中转储gdb中的MyLock内容,我会看到:

代码语言:javascript
运行
复制
{
attr = {
    __size = "\003\000\000\200",
    __align = -2147483645
},
lock = {
    __data = {
      __lock = 1
      __count = 0,
      __owner = 6742, //this is the lightweight process id of a thread in process A
      __nusers = 1,
      __kind = 131,
      __spins = 0,
      __list = {
        __prev = 0x0,
        __Next = 0x0
       }
      },
      __size = "\001\000\000\000\000 //etc,
      __align = 1     
  }
}

所以看起来不错(在另一个进程gdb中也是这样)。我正在编译这两个应用程序在一起使用没有额外的优化标志也。

EN

Stack Overflow用户

发布于 2014-06-03 09:33:39

我也有一个类似的问题:写入进程是根进程,而读取器进程是常规用户(例如硬件守护进程)。这将在任何pthread_mutex_lock()pthread_cond_wait()以及它们的解锁对应方被调用时立即在读取器中发生分段错误。

我通过使用适当的umask修改SHM文件权限来解决这个问题。

编写者

代码语言:javascript
运行
复制
umask(!S_IRUSR|!S_IWUSR|!S_IRGRP|!S_IWGRP|!S_IROTH|!S_IWOTH);
FD=shm_open("the_SHM_file", O_CREAT|O_TRUNC|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
ftruncate(FD, 28672);
SHM=mmap(0, 28672, PROT_READ|PROT_WRITE, MAP_SHARED, FD, 0);

读者

代码语言:javascript
运行
复制
FD=shm_open("the_SHM_file", O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
SHM=mmap(0, 28672, PROT_READ|PROT_WRITE, MAP_SHARED, A.FD, 0);
票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22800016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档