使用的tryLock:如何使用pthread_mutex_trylock?
FILE *fp;
pthread_mutex_t demoMutex;
void * printHello (void* threadId)
{
pthread_mutex_trylock (&demoMutex);
pthread_t writeToFile = pthread_self();
unsigned short iterate;
for (iterate = 0; iterate < 10000; iterate++)
{
fprintf (fp, " %d ", iterate, 4);
fprintf (fp, " %lu ", writeToFile, sizeof (pthread_t));
fprintf (fp, "\n", writeToFile, 1);
}
pthread_mutex_unlock (&demoMutex);
pthread_exit (NULL);
}
,然後主():
int main()
{
pthread_t arrayOfThreadId [5];
int returnValue;
unsigned int iterate;
fp = fopen ("xyz", "w");
pthread_mutex_init (&demoMutex, NULL);
for (iterate = 0; iterate < 5; iterate++)
{
if (returnValue = pthread_create (&arrayOfThreadId [iterate],
NULL,
printHello,
(void*) &arrayOfThreadId [iterate]) != 0)
{
printf ("\nerror: pthread_create failed with error number %d", returnValue);
}
}
for (iterate = 0; iterate < 5; iterate++)
pthread_join (arrayOfThreadId [iterate], NULL);
return 0;
}
這裏輸出第一打印一些第一線,然後剩下的,然後又是第一個。鎖不起作用。如果我用pthread_mutex_lock
替換它,每一件事情都會非常順序地顯示出來!
這裏有什麼可笑的錯誤?
出於好奇,你能否提供一個例子,其中'..._ lock()'優於'..._ trylock()'?防爆。如果你想實現一個超時,不會'trylock'成爲選擇嗎?或者超時沒有意義嗎? – theMayer 2018-02-15 22:22:46
'..._lock()'在大多數情況下都是合適的選項,因爲在大多數情況下,線程不能在不使用互斥鎖的情況下做出任何有用的前進進度。在這種情況下,如果使用'... trylock()'並且不能接受鎖定,則唯一的選擇是循環並嘗試再次鎖定它。 只有在需要外部事件的情況下才需要超時,這些外部事件往往會映射到條件變量,因此可以使用'pthread_cond_timedwait()'。對互斥體的無限等待表明代碼本身存在問題,而非異常情況。 – caf 2018-02-19 00:35:47
同意這裏的最後一句話......我有一些遺留代碼,開發人員有點過於雄心勃勃,也許不明白線程是如何工作的。該代碼也試圖一次睡眠一個毫秒的線程。你必須笑,否則它會讓你哭! – theMayer 2018-02-19 01:03:34