繁体   English   中英

C Pthreads互斥值?

[英]C Pthreads mutex values?

我正在编写一个包含几个关键部分的程序。 问题是我需要在if语句中检查互斥锁的值。

我想做这样的事情:

if pthread_mutex(&mutex) == 0 // locked 
  // Do something
else if pthread_mutex(&mutex) == 1 // unlocked 
 // Do something else

这可能吗?

你想要pthread_mutex_trylock()

从该链接:

pthread_mutex_trylock()函数应该等效于pthread_mutex_lock(),除非如果mutex引用的互斥对象当前被锁定(由任何线程,包括当前线程),则调用应立即返回。 ...返回值...如果获取了互斥锁引用的互斥锁对象上的锁,则pthread_mutex_trylock()函数将返回零。 否则,返回错误号以指示错误

所以你的代码会是这样的:

pthread_mutex_t *m = /* ... */;

if (pthread_mutex_trylock(m) == 0)
{
    /* Success!  This thread now owns the lock. */
}
else
{
    /* Fail!  This thread doesn't own the lock.  Do something else... */
}

不,你不应该尝试这样做。 我认为,pthread互斥锁用于管理对某些关键资源的本地访问,如果在某个地方你的程序不知道这个实际线程是否持有锁,那么你使用的是错误的工具。 我看到两种选择:

  • 保持一个变量在函数的堆栈上,你跟踪它在这里被锁定,或者如果真的有必要存储线程id并与之比较
  • 切换到sem_t作为控制DS。 它们没有被粘贴到“保持”它们的特定线程的限制,但是基于令牌,所以获得令牌的任何线程都可以完成所需的工作。 (但要小心并检查这些例程可能被中断的函数的返回值。)

如果您想知道您的互斥锁是否已被锁定,我建议您使用pthread_mutex_trylock 请记住,锁定互斥锁是一项繁重的操作,如果不是,则不应将其锁定以进行测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM