C++ pthread_join()似乎导致挂起我的程序,它在哪里出错?

C++ pthread_join()似乎导致挂起我的程序,它在哪里出错?,c++,multithreading,pthreads,C++,Multithreading,Pthreads,我有一个小程序作为测试,如下所示: #include<pthread.h> #include<unistd.h> #include<cassert> #include<iostream> using namespace std; pthread_mutex_t mt; pthread_t tid[2]; char* msg[]={"thread1","thread2"}; void* tf(void*arg){ pthread_mutex_

我有一个小程序作为测试,如下所示:

#include<pthread.h>
#include<unistd.h>
#include<cassert>
#include<iostream>
using namespace std;
pthread_mutex_t mt;
pthread_t tid[2];
char* msg[]={"thread1","thread2"};
void* tf(void*arg){
    pthread_mutex_lock(&mt);
    cout<<(char*)arg<<endl;
    return NULL;
}
int main(){
    assert(0==pthread_mutex_init(&mt,NULL));
    cout<<"step1"<<endl;
    pthread_create(&tid[0],NULL,tf,msg[0]);
    pthread_create(&tid[1],NULL,tf,msg[1]);
    pthread_join(tid[0],NULL);
    cout<<"step4"<<endl;
    pthread_join(tid[1],NULL);
    return 0;
}
然后它挂起,不再运行。代码哪里出错了? 非常感谢。

您应该调用以解锁互斥锁,并让第二个线程执行此工作:

void* tf(void*arg){
    pthread_mutex_lock(&mt);
    cout<<(char*)arg<<endl;
    pthread_mutex_unlock(&mt); // <=== here
    return NULL;
}
void*tf(void*arg){
pthread_mutex_lock(&mt);
cout您应该调用以解锁互斥锁,并让第二个线程执行此工作:

void* tf(void*arg){
    pthread_mutex_lock(&mt);
    cout<<(char*)arg<<endl;
    pthread_mutex_unlock(&mt); // <=== here
    return NULL;
}
void*tf(void*arg){
pthread_mutex_lock(&mt);

cout对于
pthread\u mutex\u lock

互斥体引用的互斥体对象应通过调用
pthread\u mutex\u lock()
线程将阻塞,直到互斥变为可用。

线程2一直在等待
mt
解锁,因为您从未解锁它,而线程1锁定了它,所以您应该在
tf
的末尾解锁:

void* tf(void*arg){
    pthread_mutex_lock(&mt);
    cout<<(char*)arg<<endl;
    pthread_mutex_unlock(&mt);
    return NULL;
}
void*tf(void*arg){
pthread_mutex_lock(&mt);

cout对于
pthread\u mutex\u lock

互斥体引用的互斥体对象应通过调用
pthread\u mutex\u lock()
线程将阻塞,直到互斥变为可用。

线程2一直在等待
mt
解锁,因为您从未解锁它,而线程1锁定了它,所以您应该在
tf
的末尾解锁:

void* tf(void*arg){
    pthread_mutex_lock(&mt);
    cout<<(char*)arg<<endl;
    pthread_mutex_unlock(&mt);
    return NULL;
}
void*tf(void*arg){
pthread_mutex_lock(&mt);

cout您应该解锁互斥锁,以允许第二个线程执行tf()函数。现在,互斥锁由第一个线程锁定(第一个线程表示启动ft()执行的第一个线程),并且永远不会解锁。我还建议使用类似std::lock\u guard(从未与pthread\u mutex一起使用,因此不知道确切的名称)为了避免此类问题,您应该解锁互斥锁,以允许第二个线程执行tf()函数。现在,互斥锁由第一个线程锁定(第一个线程表示启动ft()执行的第一个线程),并且从不解锁。我还建议使用类似std::lock\u guard(从未与pthread\u mutex一起使用,因此不知道确切名称)为了避免此类问题

为什么不使用C++的线程功能?
assert(0==pthread\u mutex\u init(&mt,NULL));
是一个bug。断言不能有副作用,因为它们通常不是非调试版本的一部分。它是挂起的,因为除了一个线程外,所有线程都无法退出。它们都等待互斥锁。在退出之前,您需要释放线程中的锁,以便让其他线程继续。使用哪个包并不重要。请参阅下面的答案w、 为什么不使用C++的线程功能?
assert(0==pthread\u mutex\u init(&mt,NULL));
是一个bug。断言不能有副作用,因为它们通常不是非调试版本的一部分。它是挂起的,因为除了一个线程外,所有线程都无法退出。它们都等待互斥锁。在退出之前,您需要释放线程中的锁,以便让其他线程继续。使用哪个包并不重要。请参阅下面的答案w、 和
std::lock\u guard
自动解锁。@NathanOliver我实际上是想键入“考虑使用
”就像在中一样,头文件,但我只是输入了实际的类,而不是意外,该死的大脑。不管怎么编辑,谢谢。没问题。我只是想让OP知道我们可以让它自动。内务管理并不有趣,如果我们能让编译器做到这一点,那对我们所有人来说都是一个胜利:)和
std::lock\u guard
来获得自动解锁ng.@NathanOliver我实际上是想输入“考虑使用
”就像在中一样,头文件,但我只是在意外中键入了实际的类,该死的大脑。不管怎么编辑,谢谢。没问题。我只是想让OP知道我们可以自动完成。内部管理不是一件有趣的事,如果我们能让编译器做到这一点,那对我们所有人来说都是一场胜利:)