thread: pthread_cond_signal() не передает управление другому потоку в состоянии ожидания

extern "C"
{
        #include<pthread.h>
}
#include<iostream>
using namespace std;

pthread_mutex_t mutex_var = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_var= PTHREAD_COND_INITIALIZER;
int A;

void * read_input(void* a)
{
        int t;
        cout<<" reading .... using thread1 "<<endl;
        for(;;)
        {
                pthread_mutex_lock(&mutex_var);
                cout<<" input value of A "<<endl;
                cin >> A;
                cout<<" A---> VALUE Changed to inputed one"<<endl;
                t=pthread_cond_signal( &cond_var );
                if(t==0)
                {
                        cout<<"logsss"<<endl;
                }
                pthread_mutex_unlock(&mutex_var);
               // pthread_cond_signal( &cond_var );
                if(A==10)
                {
                        pthread_exit(NULL);
                }
        }


}
void * write_input( void * b)
{
        cout<<" writing .... using thread2 "<<endl;
        for(;;)
        {
                pthread_mutex_lock(&mutex_var);
                pthread_cond_wait( &cond_var ,&mutex_var );

                cout<< " value of (A)= "<<A <<endl;


                pthread_mutex_unlock(&mutex_var);
                if(A==10)
                {
                        pthread_exit(NULL);
                }

        }


}

int main()
{
        pthread_t r,w;
        pthread_create(&w,NULL,&write_input,NULL);
        pthread_create(&r,NULL,&read_input,NULL);

        pthread_join(w,NULL);
        pthread_join(r,NULL);

        return 0;
}

здесь я пытаюсь прочитать ввод, используя read_input, а затем распечатать это значение, используя write_input...

но он продолжается в цикле read_input и не дает управления write_input... который должен перезапустить управление мьютексом потоку write_input для печати значения. пожалуйста помоги...

1 ответ

Вы должны позвонить pthread_cond_wait когда и только когда вы знаете, что есть, чего ждать. Вы приобретаете мьютекс, чтобы проверить общее состояние, но затем вы ничего не проверяете. Это не может быть правдой.

Вы должны позвонить pthread_cond_signal когда и только когда вам нужно сообщить другому потоку, что вы что-то изменили. Вы приобретаете мьютекс, звоните pthread_cond_signalи отпустите мьютекс. Но вы не изменили ничего, чего мог бы ожидать другой поток. Это не может быть правдой.

Грубо говоря, нет никаких доказательств того, что вы понимаете, как работает переменная условия или как правильно ее использовать. Мьютекс, связанный с условной переменной, должен защищать предикат, то, чего вы ждете. Но я не вижу никаких доказательств какого-либо предиката в вашем коде, поэтому ждать нечего и ничего, о готовности которого нужно сигнализировать.

Вы можете найти хорошее объяснение основ использования условных переменных здесь. Некоторые другие ответы тоже полезны.

Предполагая, что вы хотите, чтобы ваши потоки чередовались, вот ваш код исправлен:

extern "C"
{
    #include<pthread.h>
}
#include<iostream>
using namespace std;

pthread_mutex_t mutex_var = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_var= PTHREAD_COND_INITIALIZER;
bool read_turn = true;
int A;

void * read_input(void* a)
{
    int t;
    cout<<" reading .... using thread1 "<<endl;
    for(;;)
    {
        pthread_mutex_lock(&mutex_var);

        // Wait our turn
        while (!read_turn)
            pthread_cond_wait ( &cond_var, &mutex_var );

        cout<<" input value of A "<<endl;
        cin >> A;
        cout<<" A---> VALUE Changed to inputed one"<<endl;

        // It's now the other thread's turn
        read_turn = false;
        t=pthread_cond_signal( &cond_var );

        if(t==0)
        {
            cout<<"logsss"<<endl;
        }
        pthread_mutex_unlock(&mutex_var);
           // pthread_cond_signal( &cond_var );
        if(A==10)
        {
            pthread_exit(NULL);
        }
    }
}
void * write_input( void * b)
{
    cout<<" writing .... using thread2 "<<endl;
    for(;;)
    {
        pthread_mutex_lock(&mutex_var);

        // Wait our turn
        while (read_turn)
            pthread_cond_wait( &cond_var ,&mutex_var );

        cout<< " value of (A)= "<<A <<endl;


        // Now it's the other guy's turn
        read_turn = true;
        pthread_cond_signal (& cond_var );
        if(A==10)
        {
            pthread_mutex_unlock(&mutex_var);
            pthread_exit(NULL);
        }


        pthread_mutex_unlock(&mutex_var);
    }


}

int main()
{
    pthread_t r,w;
    pthread_create(&w,NULL,&write_input,NULL);
    pthread_create(&r,NULL,&read_input,NULL);

    pthread_join(w,NULL);
    pthread_join(r,NULL);

    return 0;
}

Обратите внимание, что он ждет, когда и только когда он знает, что есть, чего ждать. И обратите внимание, что он сигнализирует, когда и только когда он изменил какое-то общее состояние, которое может ожидать другой поток.

Другие вопросы по тегам