4

在 C++ 中,建议使用 lock_guard ,因为它可以确保在对象被销毁时解锁互斥锁。

有没有办法在 C 中实现相同的东西?还是我们必须手动实现它:

锁定互斥锁

对全局变量做某事

解锁互斥锁

#include <stdio.h>
#include <threads.h>

long long x = 0;
mtx_t m;
static void do1()  {
   mtx_lock(&m); 
   for(int i = 0; i < 100; i++){
       x = x +1;
   }
   mtx_unlock(&m);
}

static void do2()  {
   mtx_lock(&m); 
   x = x / 3;
   mtx_unlock(&m);
}

int main(int argc, char *argv[])
{ 
   mtx_init(&m, mtx_plain);
   thrd_t thr1; 
   thrd_t thr2;
   thrd_create(&thr1, do1, 0);
   thrd_create(&thr2, do2, 0);
   thrd_join(&thr2, 0);
   thrd_join(&thr1, 0);
   return 0;
}
4

1 回答 1

6

std::lock_guard是称为 RAII 的通用 C++ 概念的示例。C++ 程序员需要这个,因为 C++ 函数可能会以程序员自己没有编写的方式退出,通过抛出异常。

C 没有例外,因此像 RAII 这样的概念,尽管有其优点和实用性,但并不是真正需要的。要在 C 中完成这种配对操作,您需要自己调用这两个函数。你如何做到这一点完全取决于你。例如,您可以将锁定推迟到接受回调的包装函数:

static inline void do_locked( void (*cb)(void) ) {
   mtx_lock(&m); 
   cb();
   mtx_unlock(&m);
}

static inline void do2_impl(void) {
   x = x / 3;
}

static void do2()  {
    do_locked(do2_impl);
}

保持代码结构良好的纪律是真正需要的,即使您没有 C++ 提供的相同工具箱。

于 2019-03-27T12:24:16.203 回答