【发布时间】:2014-09-09 12:09:34
【问题描述】:
我是并行计算的新手,所以我在玩 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);
}
【问题讨论】:
-
您是否考虑过升级您的编译器(例如升级到GCC 4.9.x)并使用C++11?它有std::thread等等等等。
-
如果您使用 C++,请使用 std::thread。在某些方面更容易。
-
或者只是修复你的代码。删除构造函数中的
pthread_mutex_t mutex;。本地 var 隐藏了未初始化的类成员。 -
如果您想使用 C++11 风格的线程,但还不能使用足够新的编译器,boost::thread 非常相似,并且在更旧的系统上运行良好。
标签: c++ pthreads mutex deadlock