使用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); }
然后是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, " %dn", iterate); } pthread_mutex_unlock (&demoMutex); } pthread_exit (NULL); }
但是,使用pthread_mutex_lock()
而不是pthread_mutex_trylock()
可能更有意义,因此如果争用的话,您的线程将等待互斥锁可用。 pthread_mutex_lock()
在几乎所有情况下都是你想要的; _trylock
变体仅用于优化一些不寻常的情况 - 如果您遇到需要_trylock
的情况,您就会知道。
... while (pthread_mutex_trylock(&demoMutex) == 0) ...
你的代码毫无意义。 强行锁定在哪里? 这就像一个不工作的自旋锁使用更多的CPU?!
trylock锁定时返回0,所以:
if(!pthread_mutex_trylock(&demoMutex)) { // mutex locked }
如果获取了互斥锁引用的互斥对象上的锁,则pthread_mutex_trylock()函数将返回零。 否则,返回错误号以指示错误。
caf对如何使用它有很好的答案。 我只需要为自己解释这个解释,但是我确实知道pthread_mutex_lock()
在类中有更多的开销,只是使用
lib测试它,并且我的循环的性能显着提高。 只需添加两美分,因为他提到可能你应该使用pthread_mutex_lock()
代替!
#include #include #include #include #define NUM_THREADS 4 #define LOOPS 100000 int counter; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // using pthread_mutex_lock void* worker() { for (int i = 0; i < LOOPS; i++) { pthread_mutex_lock(&mutex); counter++; pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } // using try_lock - obviously only use one at a time void* worker() { for (int i = 0; i < LOOPS; i++) { while (pthread_mutex_trylock(&mutex) != 0) { // wait - treated as spin lock in this example } counter++; pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } int main(int argc, char *argv[]) { clock_t begin = clock(); pthread_t t[NUM_THREADS]; int rc; counter = 0; for (int i = 0; i < NUM_THREADS; i++) { rc = pthread_create(&t[i], NULL, worker, NULL); if (rc) { printf("Thread #%d failedn", i); } } for (int i = 0; i < NUM_THREADS; i++) { pthread_join(t[i], NULL); } printf("%dn", counter); clock_t end = clock(); double time = (double)(end - begin) / CLOCKS_PER_SEC; printf("Time Spent: %f", time); return 0; }
显然你会注释掉一个工人来测试它,但如果你试一试,我会Time Spent: 1.36200
作为pthread_mutex_lock()
的平均值和Time Spent: 0.36714
pthread_mutex_trylock()
Time Spent: 0.36714
。
如果使用Atomics,会再次加快速度。
代码旨在阻止在您调用pthread_mutex_trylock()
地方进行互斥 。 否则它是未定义的行为。 因此,您必须调用pthread_mutex_lock()
。
用while循环锁定的修改版本的力应该更稳定。
void *printHello(void *threadId) { while (pthread_mutex_trylock(&demoMutex) == 0) { unsigned short iterate; for (iterate = 0; iterate < 10000; iterate++) { fprintf (fp, " %dn", iterate); } pthread_mutex_unlock (&demoMutex); break; } pthread_exit (NULL);
}`
pthread_mutex_trylock的使用用于确保tou不会导致特定命令的竞争。 为此,您必须使用pthread_mutex_trylock作为条件! 不要以为它会自行运作。 example- while(pthread_mutex_trylock(&my_mutex)== 0){printf(“互斥锁在我的控制下!! n”); }
这样你就可以确定即使互斥锁现在被锁定了,你也会在特定的线程中进行abusy等待。
以上就是c/c++开发分享如何使用pthread_mutex_trylock?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562782.html