c++ - 带互斥锁的条件变量演示程序挂起

标签 c++ pthreads mutex

想法:

当线程A需要检查条件变量x的状态时,它会先持有互斥锁,然后检查变量的状态,如果发现无效,则开始等待。

线程 B 不会中断,因为线程 A 当前具有互斥锁。一旦线程 A 等待,它就会释放互斥量。
线程 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

然后它就会挂起。

我需要在这里更正什么以及为什么?

最佳答案

线程在这里 pthread_cond_wait (&cond, &mutexLock); 无限期地等待,因为没有其他线程向它发出信号。线程 B 对锁和条件变量什么都不做

关于c++ - 带互斥锁的条件变量演示程序挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14314961/

相关文章:

c++ - 模板类中方法的部分特化

c++ - 终止阻塞的 pthreads 线程

macos - Mac OS X 中的 Pthreads - 互斥锁问题

c++ - C++11 和 C++17 基于范围的 For 循环是否可以迭代到特定位置而不是 map 的整个范围?

c++ - GCC:程序不适用于编译选项 -O3

c++ - 调用不带参数的函数,即使它们已定义?

c++ - 带线程的 fork 和 core dump

c - 从线程中定义的函数返回结构

条件变量和 mutex_unlock

concurrency - 互斥锁的 rust 访问选项