gpt4 book ai didi

c++ - pthread_mutex_t 作为类成员导致死锁

转载 作者:太空宇宙 更新时间:2023-11-04 15:18:30 25 4
gpt4 key购买 nike

我是并行计算的新手,所以我正在研究 pthread 和互斥量。运行以下代码会导致死锁。谁能解释我为什么,以及如何以正确的方式做到这一点?我的目的是保护成员变量不被交叉写入。非常感谢!

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

class mutex_class
{

public:
mutex_class();
void print_stars(int count);
void print_dots(int count);

private:
pthread_mutex_t mutex;

};

mutex_class::mutex_class()
{
pthread_mutex_t mutex;
pthread_mutex_init (&mutex, NULL);
}

void mutex_class::print_stars(int count)
{
pthread_mutex_lock(&this->mutex);
for(int i=0; i<count; i++)
{
std::cout << "*" << std::flush;
}
pthread_mutex_unlock(&this->mutex);
}

void mutex_class::print_dots(int count)
{
pthread_mutex_lock(&this->mutex);
for(int i=0; i<count; i++)
{
std::cout << "." << std::flush;
}
pthread_mutex_unlock(&this->mutex);
}

void* call_dots(void* m)
{
(*(mutex_class*)m).print_dots(20);
}

void* call_stars(void* m)
{
(*(mutex_class*)m).print_stars(20);
}

int main()
{
mutex_class m1 = mutex_class();
pthread_t t1, t2;
pthread_create(&t1, NULL, call_dots, (void*)&m1);
pthread_create(&t2, NULL, call_stars, (void*)&m1);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return(0);
}

最佳答案

问题出在这里:

mutex_class::mutex_class()
{
pthread_mutex_t mutex; // <<< remove this line
pthread_mutex_init (&mutex, NULL);
}

您正在初始化一个本地互斥量,并使成员变量未初始化。

除非您出于某种原因被困在过去,否则请考虑使用标准 C++ 线程库;与使用 C 风格的 API 相比,它更便携,更不容易出错。这是您使用更 C++ 习惯用法的程序:

#include <thread>
#include <mutex>
#include <iostream>

class mutex_class
{
public:
// No need for a special constructor

void print_stars(int count);
void print_dots(int count);

private:
std::mutex mutex;
};

void mutex_class::print_stars(int count)
{
std::lock_guard<std::mutex> lock(mutex); // unlocks automatically
for(int i=0; i<count; i++)
{
std::cout << "*" << std::flush;
}
}

void mutex_class::print_dots(int count)
{
std::lock_guard<std::mutex> lock(mutex); // unlocks automatically
for(int i=0; i<count; i++)
{
std::cout << "." << std::flush;
}
}

// No need to muck around with C-style 'void*' functions

int main()
{
mutex_class m1;
std::thread t1([&]{m1.print_dots(20);});
std::thread t2([&]{m1.print_stars(20);});
t1.join();
t2.join();
}

关于c++ - pthread_mutex_t 作为类成员导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25744274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com