gpt4 book ai didi

c - atomic_bool 值更新,其他进程看不到

转载 作者:太空狗 更新时间:2023-10-29 15:26:12 24 4
gpt4 key购买 nike

我有一个包含两个进程的程序,这些进程使用共享内存进行通信。在 ctrl-c 上,我希望两个进程都退出。我正在使用一个名为 stop 的 atomic_bool 变量来通知进程在设置为 true 时保持循环或退出。但是,当 atomic_bool 变量 stop 设置为 true 时,其他进程看不到更改。这意味着它仍然打印出 0 而不是 1,但是进行更改的进程显示 1。那么为什么第二个进程看不到从 false 到 true 的变化?

Control-c 无法终止进程,因此请改用 killall

#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <stdbool.h>
#include <stdatomic.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <errno.h>

struct shared_map
{

atomic_bool stop;

};

struct shared_map *map;

int compare_and_swap_loop(atomic_bool target, int value)
{
/* Loop until we can succesfully update the the value. */
while(1)
{
/* Grab a snapshot of the value that need to be updated. */
bool snapshot = atomic_load(&target);

if(atomic_compare_exchange_weak(&target, &snapshot, value) == true)
{
/* We succesfully updated the value let's exit this loop and return. */
break;
}
}

printf("result: %d\n", atomic_load(&target));

return 0;
}

static void ctrlc_handler(int sig)
{
compare_and_swap_loop(&map->stop, true);

return;
}

void setup_signal_handler(void)
{
(void) signal(SIGINT, ctrlc_handler);

return;
}

static int create_shared(void **pointer, int size)
{
*pointer = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
if(*pointer == MAP_FAILED)
{
printf("mmap: %s\n", strerror(errno));
return -1;
}

return 0;
}

static void loop(void)
{
/* Set up signal handler. */
setup_signal_handler();

/* Check if we should stop or continue running. */
while(atomic_load(&map->stop) == false)
{
sleep(2);

printf("map->stop: %d\n", atomic_load(&map->stop));
}

return;
}

int main(void)
{
int rtrn;
pid_t pid;

rtrn = create_shared((void **)&map, sizeof(struct shared_map));
if(rtrn < 0)
{
printf("Can't create shared memory\n");
return -1;
}

atomic_init(&map->stop, false);

pid = fork();
if(pid == 0)
{
loop();

_exit(0);
}
else if(pid > 0)
{
int status;

waitpid(pid, &status, 0);

return 0;
}
else
{
printf("fork: %s\n", strerror(errno));
return -1;
}

return 0;
}

最佳答案

您将原子变量的副本传递给您的 compare_and_swap_loop 函数,这对您没有任何好处 - 您需要处理进程之间共享的相同值。

你需要这样做:

int compare_and_swap_loop(atomic_bool *target, int value)
{
/* Loop until we can succesfully update the the value. */
while(1)
{
/* Grab a snapshot of the value that need to be updated. */
bool snapshot = atomic_load(target);

if(atomic_compare_exchange_weak(target, &snapshot, value) == true)
{
/* We succesfully updated the value let's exit this loop and return. */
break;
}
}

printf("result: %d\n", atomic_load(target));

return 0;
}

关于c - atomic_bool 值更新,其他进程看不到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31899284/

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