互斥锁线程

我是多线程/进程编程新手。
所以我需要澄清一下

处理代码

pthread\u mutex\u lock()
pthread_create(fooAPI(sharedResource))//fooAPI创建另一个线程,该线程具有跨进程共享的共享资源。
pthread_mutex_unlock()

使用上述伪代码,如果互斥锁未解锁,进程B是否能够访问sharedResource

如何从进程B正确访问sharedResource

有没有清晰的可视化图表来解释互斥体、线程和进程之间的关系

您需要做的是调用pthread_mutex_lock来保护互斥锁,如下所示:

pthread\u mutex\u lock(&mutex);

执行此操作后,任何其他对pthread\u mutex\u lock(mutex)的调用都不会返回,直到您在此线程中调用pthread\u mutex\u unlock。因此,如果您尝试调用pthread_create,您将能够创建一个新线程,并且该线程将能够(错误地)使用共享资源。您应该在fooAPI函数中调用pthread\u mutex\u lock,这将导致函数等待共享资源可用

所以你会有这样的想法:

#包括<pthread.h>
#包括<标准h>
int sharedResource=0;
pthread\u mutex\u t mutex=pthread\u mutex\u初始值设定项;
void*fooAPI(void*param)
{
pthread_mutex_lock(&mutex);
printf(“立即更改共享资源。\n”);
sharedResource=42;
pthread_mutex_unlock(&mutex);
返回0;
}
int main()
{
pthread\u t线程;
//真的没有锁定任何原因以外的重点。
pthread_mutex_lock(&mutex);
pthread_create(&thread,NULL,fooAPI,NULL);
睡眠(1);
pthread_mutex_unlock(&mutex);
//现在我们需要锁定以使用共享资源。
pthread_mutex_lock(&mutex);
printf(“%d\n”,sharedResource);
pthread_mutex_unlock(&mutex);
}

编辑:跨进程使用资源遵循相同的基本方法,但您需要将内存映射到其他进程中。下面是一个使用shmem的示例:

#包括<标准h>
#包括<unistd.h>
#包括<sys/file.h>
#包括<系统/mman.h>
#包括<sys/wait.h>
结构共享{
pthread_mutex_t mutex;
int共享资源;
};
int main()
{
int fd=shm_open(“/foo”,O_CREAT | O|u TRUNC | O|RDWR,0600);
ftruncate(fd,sizeof(结构共享));
struct shared*p=(struct shared*)mmap(0,sizeof(struct shared),
保护读写,映射共享,fd,0);
p->sharedResource=0;
//确保它可以跨流程共享
pthread_mutextatr_t shared;
pthread_mutexattr_init(&shared);
pthread_mutexattr_setpshared(&shared,pthread_PROCESS_shared);
pthread_mutex_init(&(p->mutex),&shared);
int i;
对于(i=0;i<100;i++){
pthread_mutex_lock(&(p->mutex));
printf(“%d\n”,p->sharedResource);
pthread_mutex_unlock(&(p->mutex));
睡眠(1);
}
munmap(p,sizeof(struct shared*));
shm_取消链接(“/foo”);
}

编写程序以更改p->sharedResource将留给读者作为练习。:-)

顺便说一句,忘了注意互斥体必须设置PTHREAD_PROCESS_SHARED属性,这样PTHREAD才能跨进程工作

发表评论