【问题标题】:POSIX SHARED - RECURSIVE MutexPOSIX 共享 - 递归互斥锁
【发布时间】:2012-06-29 21:34:16
【问题描述】:

我正在使用 Linux。 在我的代码中,我试图运行几个线程(例如 2 个)试图锁定 RECURSIVE 互斥锁,但只有一个线程可以访问和锁定互斥锁,而第二个线程即使在第一个线程之后也会出现 EBUSY 错误线程已将其解锁。我认为这是因为互斥锁是私有的而不是共享的。

我正在尝试将互斥锁设置为 RECRUSIVE 和 SHARED,如下所示:

    void
MutexCreate(pthread_mutex_t* _m)
{
    pthread_mutexattr_t attr; 

    pthread_mutexattr_init(&attr);
    pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
    pthread_mutex_init(_m, &attr); 
}

(我确实检查了函数错误 - 所有错误都返回 0)

即使我尝试通过以下方式使其成为默认共享互斥锁:

    void
MutexCreate(pthread_mutex_t* _m)
{
    pthread_mutexattr_t attr; 

    pthread_mutexattr_init(&attr);
    pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
    pthread_mutex_init(_m, &attr); 
}

它仍然是 PRIVET。

有什么想法吗?

【问题讨论】:

标签: c posix mutex


【解决方案1】:

如果您在同一个进程中确实有两个线程,pshared 属性应该不会产生影响。

EBUSY 只允许作为pthread_mutex_trylock 的返回值,所以我想你使用了这个。

我唯一的解释是你可能用第一个线程多次锁定你的互斥锁。 lock 和 unlock 总是成对出现,确保 unlocks 与 locks 一样多。

【讨论】:

  • 我想我没有提供足够的信息(有时我很难解释自己+我是这个级别的编程新手)。有两个进程(一个核心和测试)所以我运行核心然后开始运行测试,核心线程数无关紧要。测试线程数为 2+。不知何故,第一个测试线程确实锁定和解锁了互斥锁。完成测试后,它等待第二个线程完成(我在那里尝试了trylock(第一个线程等待其他线程)并解锁(但第二个线程仍然认为它是锁定的)。抱歉没有提及之前。
  • 所以互斥锁位于核心和测试可以访问的共享内存段中?您使用什么实用程序来实现这一目标?是初始化互斥锁的核心进程吗?但是你说访问它的两个线程在同一个进程中?也许为了简化首先从这两个线程之间共享的互斥锁开始。但是您的描述也表明互斥锁可能不是您目标的正确工具。您需要某种使用计数器或类似的东西吗?
  • 抱歉耽搁了,我不需要使用计数器。我尝试将这个特定的互斥体创建为共享的,但不知何故它仍然是私有的。
猜你喜欢
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
相关资源
最近更新 更多