如何使用pthread_mutex_trylock?

时间:2012-02-13 09:40:02

标签: c pthreads 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);
}

然后是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替换它,每个东西都会按顺序显示!

这里有什么荒谬的错误?

6 个答案:

答案 0 :(得分:28)

在不测试结果的情况下调用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的情况,您就会知道。

答案 1 :(得分:6)

...
while (pthread_mutex_trylock(&demoMutex) == 0)
...

你的代码毫无意义。强行锁定在哪里?这就像一个不工作的自旋锁使用更多的CPU?!

trylock 在锁定时返回0,所以:

if(!pthread_mutex_trylock(&demoMutex))
{
  // mutex locked
}
  

如果锁定,pthread_mutex_trylock()函数将返回零   获取互斥锁引用的互斥锁对象。否则,出错   返回数字以指示错误。

答案 2 :(得分:4)

caf如何使用它有一个很好的答案。我只是不得不为自己抓住这个解释,但是我确实知道<%= asset_path "images/example.png" %> <%= asset_path "javascripts/application.js" %> <%= asset_path "stylesheets/application.css" %> /assets/images/example-ca63e56ac855bdfb187479a35a7476cd65c539727f84fea19e1ad258cf3d23f5.png /assets/javascripts/application-a4f3e75c7f7aa6d6cbc2ebcbb436b12aca442553219883805baebdd2eecd5471.js /assets/stylesheets/application-539757f75200b6ea43399bf5e25cbc2819c1e6a610f94d5c9beaf91fec89384e.css 在课堂上有更多的开销,只是使用pthread_mutex_lock() lib测试它,并且我的循环的性能显着提高。自从他提到可能你应该使用<time.h>代替时,只需加上两美分!

pthread_mutex_lock()

显然,你会评论出一名工作人员对其进行测试,但如果你试一试,我会#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #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 failed\n", i); } } for (int i = 0; i < NUM_THREADS; i++) { pthread_join(t[i], NULL); } printf("%d\n", counter); clock_t end = clock(); double time = (double)(end - begin) / CLOCKS_PER_SEC; printf("Time Spent: %f", time); return 0; } 作为Time Spent: 1.36200pthread_mutex_lock() Time Spent: 0.36714的平均值。

如果使用Atomics,请再次加快速度。

答案 3 :(得分:0)

代码旨在阻止您调用pthread_mutex_trylock()互斥。否则它是未定义的行为。因此,您必须致电pthread_mutex_lock()

答案 4 :(得分:0)

用while循环锁定的修改版力应该更稳定。

void *printHello(void *threadId)

{

   while (pthread_mutex_trylock(&demoMutex) == 0)

   {

        unsigned short iterate;

        for (iterate = 0; iterate < 10000; iterate++)

        {

            fprintf (fp, " %d\n", iterate);

        }


        pthread_mutex_unlock (&demoMutex);

        break;

    }

pthread_exit (NULL);

}`

答案 5 :(得分:0)

pthread_mutex_trylock的使用用于确保tou不会导致特定命令的竞争。 为此,您必须使用pthread_mutex_trylock作为条件!不要以为它会自行运作。 例-     而(pthread_mutex_trylock(安培; my_mutex)== 0){           printf(“互斥锁在我的掌控之中!! \ n”);      }

通过这种方式,您可以确定即使互斥锁现在已被锁定,您也会在该特定线程中进行abusy等待。