我是多线程/进程编程新手。
所以我需要澄清一下
处理代码
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才能跨进程工作