【发布时间】:2026-01-28 06:05:03
【问题描述】:
我有以下程序:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <iostream>
int main() {
pthread_mutex_t lock_;
pthread_mutexattr_t ma;
pthread_mutexattr_init( &ma );
pthread_mutexattr_setpshared( &ma, PTHREAD_PROCESS_SHARED );
pthread_mutexattr_settype( &ma, PTHREAD_MUTEX_ERRORCHECK );
pthread_mutex_init( &lock_, &ma );
pthread_mutex_lock( &lock_ );
if(fork()==0) {
std::cout << "child" << std::endl;
pthread_mutex_lock( &lock_ );
std::cout << "finish" << std::endl;
} else {
std::cout << "parent" << std::endl;
sleep(1);
pthread_mutex_lock( &lock_ );
std::cout << "parent done" << std::endl;
}
}
我看到的行为是父母可以重新锁定互斥锁,但不能重新锁定孩子。我本来希望 fork() 分叉当前线程的所有上下文,所以孩子最终会得到一个它已经锁定的锁(IE,我不想共享锁 - 两个进程都有自己的锁是我想要的)。为什么这不起作用/我该如何完成?
【问题讨论】:
-
那么就没有办法让当前线程锁定的互斥量,而在fork之后,子进程和父进程的互斥量都在那个进程中工作?
-
在初始化期间设置错误检查时是否检查了 pthread_mutex_lock 的返回码?在父级第二次调用 pthread_mutex_lock 时应该返回错误。
标签: c++ multithreading