0

我正在研究Linux。在我的代码中,我试图运行一些试图锁定 RECURSIVE 互斥锁的线程(例如 2 个),但只有一个线程可以访问并锁定互斥锁,而第二个线程即使在第一个线程之后也会出现 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。

有任何想法吗?

4

1 回答 1

1

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

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

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

于 2012-06-28T12:54:41.060 回答