C语言 如何干净地实例化由其中一个线程本身中的线程共享的全局互斥锁



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

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

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

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

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

你想要的是一个GStaticMutex。在线程函数中将其声明为静态局部变量,并使用 G_STATIC_MUTEX_INIT 初始化它:

static GStaticMutex my_mutex = G_STATIC_MUTEX_INIT;

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

请参阅链接参考中的示例。

最新更新