English 中文(简体)
C线程互斥值?
原标题: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()

从该链接:

The pthread_mutex_trylock() function shall be equivalent to pthread_mutex_lock(), except that if the mutex object referenced by mutex is currently locked (by any thread, including the current thread), the call shall return immediately. ... Return values ... The pthread_mutex_trylock() function shall return zero if a lock on the mutex object referenced by mutex is acquired. Otherwise, an error number is returned to indicate the error

因此,您的代码如下所示:

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互斥是为了规范对某些关键资源的本地访问,如果在某个地方你的程序不知道这个实际线程是否持有锁,那么你使用了错误的工具。我看到了两种选择:

  • keep a variable on the stack of the function where you keep track that it is locked here, or if really necessary store the thread id and compare to that
  • switch to sem_t as control DS. they don t have this restriction of being glued to a specific thread that "holds" them, but are token based, so any thread that obtains the token may do the work that is required. (but be careful and check the return value of the functions these routines may be interrupted.)

如果你想知道你的互斥是否已经被锁定,我建议你使用pthread_mutex_trylock。请记住,锁定互斥是一项繁重的操作,不应该仅仅为了测试它是否不是。





相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签