c - 如何干净地实例化一个线程本身中的线程共享的全局互斥锁

标签 c multithreading mutex glib gobject

我使用 GLib/GObject 并面临以下问题:

我有一个类 my_class,它在运行时将在多个线程中有多个对象实例,其中每个对象将存在于单个线程中(因此线程和对象之间存在 1:1 的关系对象)。

但是,该对象将访问共享资源,我需要锁定以保护对该资源的访问。现在,我需要一个全局互斥锁(GLib 世界中的 GMutex)实例,所有线程/对象都可以锁定它。

我目前的方法是在生成线程之前创建该互斥锁,并在构造函数中传递该全局互斥锁。但我不喜欢这种做法。在创建线程之前,互斥量与调用代码无关 - 它只是 my_class 的功能所必需的,因此应该只是 my_class 的一部分用于干净的 OO 设计。

但是如何从 my_class 中创建一个单个互斥体?我可以创建一个 static GMutex *global_mutex 并将其作为全局变量,在所有线程之间共享。但是何时/如何调用 g_mutex_new()?我想将它放在 my_class 的构造函数中,但代码只需要运行一次。要实现这一点,我首先需要锁定,而且我面临着先有鸡还是先有蛋的问题。

最佳答案

你想要的是一个GStaticMutex .在线程函数中声明为静态局部变量,初始化为G_STATIC_MUTEX_INIT :

static GStaticMutex my_mutex = G_STATIC_MUTEX_INIT;

这声明、定义并初始化互斥锁,因此可以直接使用它。

请参阅链接引用中的示例。

关于c - 如何干净地实例化一个线程本身中的线程共享的全局互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19536367/

相关文章:

c - 为什么我不能在 ListFunction.h 中包含 ListDefinition.h

c - C中通过http发送图像

c - 我的程序运行正常,但收到警告

java - 如何让所有类方法只在单线程上运行? (同步课?)

c# - Try/Catch 和线程

c++ - 将 std::mutex 设为静态是否会为互斥体本身创建竞争条件

multithreading - 互斥锁是否也适用于被调用的函数?

c - .symtab 部分的 Ndx 列中的 "COM"是什么意思?

c# - 同时执行两个独立的方法

c++ - scoped_lock 的范围