0

考え:

スレッド A が条件変数の状態を確認する必要がある場合、x最初にミューテックス ロックを保持し、次に変数の状態を確認します。無効であることが判明した場合は、待機を開始します。

スレッド A には現在ミューテックスがあるため、スレッド B からの割り込みはありません。スレッド A が待機すると、mutex が解放されます。
その後、スレッド B はミューテックスを取得し、やりたいことを何でも実行できます。

#include <stdlib.h>
#include <pthread.h>
#include <iostream>

pthread_mutex_t mutexLock  = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t  cond       = PTHREAD_COND_INITIALIZER;
void *                functionOfThreadA (void * ptr);
void *                functionOfThreadB (void * ptr);
int                     x  = 0;

int main ()
{
    pthread_t threadA;
    pthread_t threadB;
    char      *messageA = (char *) "Thread A"; // TODO
    char      *messageB = (char *) "Thread B";
    int       returnValueA;
    int       returnValueB;


    returnValueA = pthread_create (&threadA, NULL, functionOfThreadA, (void*) messageA);
    returnValueB = pthread_create (&threadB, NULL, functionOfThreadB, (void*) messageB);

    pthread_join (threadA, NULL);
    pthread_join (threadB, NULL);

    exit (0);
}

void * functionOfThreadA (void * ptr)
{
    char * message;
    message = (char *) ptr;
    std :: cout << "\nA: " << message << "\n";

    while (1)
    {
        pthread_mutex_lock (&mutexLock);

        if (x == 10)
        {
            std :: cout << "\nx == 10 : true, functionOfThread A: " << message << "\n";
        }
        else
        {
            std :: cout << "\nThread waits." << "\n";
            pthread_cond_wait (&cond, &mutexLock);
            std :: cout << "\nA:++ " << message << "\n";
        }

        pthread_mutex_unlock (&mutexLock);
        return 0;
    }
}

void * functionOfThreadB (void * ptr)
{
    while (1)
    {
        char * message;
        message = (char *) ptr;

        pthread_mutex_lock (&mutexLock);

        x = x + 1;
        if (x == 10)
        {
            std :: cout << "\nfunctionOfThread B: " << message << "\n";
            pthread_cond_signal (&cond);
        }
        else
        {
            std :: cout << "\nB: Not signaled yet. Value of x: " << x << "\n";
        }

        pthread_mutex_unlock (&mutexLock);
        return 0;
    }
}

出力:

anisha@linux-trra:~> ./a.out 
B: Not signaled yet. Value of x: 1

A: Thread A

Thread waits.
^C

そして、それは単にハングします。

ここで何を修正する必要があり、その理由は何ですか?

4

2 に答える 2

1

pthread_cond_wait (&cond, &mutexLock);スレッドは、それを通知する他のスレッドがないため、ここで無期限に待機します 。スレッドBは、ロックと条件変数には何もしません。

于 2013-01-14T08:04:14.233 に答える
0

問題が発見されました。

シグナルを発行したら、ループから抜け出す必要があります。ただし、その前に、ミューテックスのロックを解除する必要もあります。で追加されたコードは、以下のプログラムで* ** * **functionOfThreadBで強調表示されています。

#include <stdlib.h>
#include <pthread.h>
#include <iostream>

pthread_mutex_t mutexLock  = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t  cond       = PTHREAD_COND_INITIALIZER;
void *                functionOfThreadA (void * ptr);
void *                functionOfThreadB (void * ptr);
int                     x  = 0;

int main ()
{
    pthread_t threadA;
    pthread_t threadB;
    char      *messageA = (char *) "Thread A";
    char      *messageB = (char *) "Thread B";
    int       returnValueA;
    int       returnValueB;

    returnValueA = pthread_create (&threadA, NULL, functionOfThreadA, (void*) messageA);
    returnValueB = pthread_create (&threadB, NULL, functionOfThreadB, (void*) messageB);

    pthread_join (threadA, NULL);
    pthread_join (threadB, NULL);

    exit (0);
}

void * functionOfThreadA (void * ptr)
{
    char * message;
    message = (char *) ptr;

    while (1)
    {
        pthread_mutex_lock (&mutexLock);

        if (x == 1000)
        {
            std :: cout << "\nA: x is now 1000. Waiting period over."<< "\n";
            return 0;
        }
        else
        {
            std :: cout << "\nNow, thread A will wait for value of `x` to reach 1000" << "\n";
            pthread_cond_wait (&cond, &mutexLock);
        }

        pthread_mutex_unlock (&mutexLock);
    }
}

void * functionOfThreadB (void * ptr)
{
    while (1)
    {
        char * message;
        message = (char *) ptr;

        pthread_mutex_lock (&mutexLock);

        x = x + 1;
        if (x == 1000)
        {
            std :: cout << "\nB: Signaled. Value of x: " << x << "\n";
            pthread_cond_signal (&cond);
    *************pthread_mutex_unlock (&mutexLock);*************
    *************return 0;*************
        }
        else
        {
            std :: cout << "\nB: Not signaled yet. Value of x: " << x << "\n";
        }

        pthread_mutex_unlock (&mutexLock);
    }
}
于 2013-01-14T11:11:52.393 に答える