1. ホーム
  2. c

[解決済み] pthread_mutex_trylock の使用方法について教えてください。

2022-02-18 19:58:46

質問

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, " %d\n", iterate);
        }

        pthread_mutex_unlock (&demoMutex);
    }

    pthread_exit (NULL);
}

しかし、おそらく pthread_mutex_lock() ではなく pthread_mutex_trylock() そうすれば、スレッドはミューテックスが争われたときに利用可能になるのを待つことができます。 pthread_mutex_lock() は、ほとんどすべての場合に必要なものです。 _trylock バリアントは特殊なケースを最適化するためだけのものです。 _trylock が必要であることがわかると思います。