try 以高性能的方式同步调用函数,仅使用全局变量

我正在try 通过以下方式同步调用函数foo:

bool global_var=0;
void* task(void*) {
    while(global_var);
    global_var=1;
    foo();
    global_var=0;
}

那么,从多个线程调用任务()会导致数据竞争或未定义的行为吗?

推荐答案

是的,没有什么能保证在您退出while(global_var);之后布尔值不会立即被修改

在我看来,您试图这样做是为了确保只有一个线程可以同时运行foo().已经有专门用于此任务的对象,称为mutex.假设您使用的是pthread.h:

#include <pthread.h>

pthread_mutex_t lock;

int init_lock()
{
    return pthread_mutex_init(&lock, NULL);
}

void task()
{
    pthread_mutex_lock(&lock);
    foo();
    pthread_mutex_unlock(&lock);
}

这是我认为您正在try 做的事情的正确方式.互斥体是专门为保护共享资源而设计的.

我建议您阅读有关互斥锁、信号量和原子变量的知识.

C++相关问答推荐

CC crate 示例不会与C函数链接

ATmega328P USART发送字符重复打印

如何判断宏参数是否为C语言中的整型文字

如果包含路径不存在,我的编译器可以被配置为出错吗?(GCC、MSVC)

如何跨平台处理UTF-16字符串?

仅在给定的大小和对齐方式下正确创建全局

LibpCap禁用监视器模式(C、MacOS)

_泛型控制表达式涉及数组碰撞警告的L值转换错误?

初始变量重置后,char[]的赋值将消失

在另一个函数中使用realloc和指针指向指针

GTK函数调用将完全不相关的char* 值搞乱

使用TCL C API导航到列表中的元素

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

在C中包装两个数组?

C代码可以在在线编译器上运行,但不能在Leetcode上运行

如何在VSCode中创建和使用我自己的C库?

如何在不使用字符串的情况下在c中编写函数atof().h>;

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

将char*数组深度复制到 struct 中?

文件指针引起的C程序分段错误