gpt4 book ai didi

c - 如何使用pthread_mutex_trylock?

转载 作者:太空狗 更新时间:2023-10-29 16:50:34 27 4
gpt4 key购买 nike

使用尝试锁:

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);
}

然后是main():

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 替换它,那么每件事都会按顺序显示!

这里有什么可笑的错误?

最佳答案

不测试结果就调用pthread_mutex_trylock()是没有意义的。

如果它无法获取互斥锁,您不应该进入临界区,您以后也不应该解锁它。例如,您可以这样重写它(请注意,您也对如何调用 fprintf() 感到很困惑):

void *printHello(void *threadId)
{
if (pthread_mutex_trylock(&demoMutex) == 0)
{
unsigned short iterate;
for (iterate = 0; iterate < 10000; iterate++)
{
fprintf (fp, " %d\n", iterate);
}

pthread_mutex_unlock (&demoMutex);
}

pthread_exit (NULL);
}

但是,使用 pthread_mutex_lock() 而不是 pthread_mutex_trylock() 可能更有意义,这样您的线程将等待互斥体可用(如果它可用)争论。 pthread_mutex_lock() 几乎在所有情况下都是您想要的; _trylock 变体仅用于优化一些异常情况 - 如果您遇到需要 _trylock 的情况,您就会知道。

关于c - 如何使用pthread_mutex_trylock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9258308/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com