gpt4 book ai didi

c - 如何让 pthread_mutex_lock() 阻塞而不是成功?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:06 24 4
gpt4 key购买 nike

我以为我知道 C 和互斥锁……显然我不知道。

下面的代码,我希望打印地址,等待 5 秒,然后再次打印相同的地址。

它不会 - 它打印相同的地址两次,但立即打印,为什么?

我编译代码

>gcc -lpthread foobar.c

我一定是没有理解一些明显的东西,这很尴尬......

根据 Jonathan Leffler 和 Chris Dodd 以及 user3629249 的建议,我编辑了如下代码,同样的问题。这真的很尴尬......

foobar.c:

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>


void foobar(pthread_mutex_t *plock) {
pthread_mutex_lock(plock);
printf("lock address %p\n", plock);
fflush(stdout);
sleep(5);
pthread_mutex_unlock(plock);
}

int main(void)
{
pthread_mutex_t *plock;
pthread_mutexattr_t attr;

pthread_mutexattr_init(&attr);
printf("return %d\n", pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED));
printf("mutex allocated %p\n", plock = malloc(sizeof(pthread_mutex_t)));
printf("return %d\n", pthread_mutex_init(plock, &attr));
fork() ? foobar(plock) : foobar(plock);
}

最佳答案

pthread 互斥体用于在单个进程 中同步线程。当您调用 fork 时,它会创建一个新的进程,其中包含所有父进程资源的副本。

所以在这种情况下,有两个独立的互斥量,一个在父进程中,一个在子进程中。子项中互斥量的初始状态是从父项中复制的,但由于该状态已解锁,所以这只是一个新的解锁互斥量。

然后 parent 和 child 都获得自己的互斥量并继续。

如果您要更改代码以调用 pthread_create 而不是 fork,它会更像您(显然)期望的那样工作。

请注意,可能在不同进程中的线程之间使用 pthread 互斥体——如果您在进程共享的共享内存空间中创建互斥体并使用适当的 PROCESS_SHARED 属性。

要在共享内存中创建互斥量,您可以将 malloc() 调用替换为:

plock = mmap(NULL, (sizeof *plock + 4095) & ~4095UL, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0)

(此处的 4095 值实际上应该比系统页面大小小一,sysconf(_SC_PAGE_SIZE) - 1)

关于c - 如何让 pthread_mutex_lock() 阻塞而不是成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33336639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com