【发布时间】:2019-03-16 22:41:38
【问题描述】:
在 GLib 中,是否有一个操作告诉它“如果你还没有持有它就获取锁”?同一个线程是否可以获取两次锁(使第二次获取为空操作,或要求释放两次)或测试它是否已经持有特定锁?
假设我的代码中有以下函数:
void func_a() {
//g_rw_lock_writer_lock(&shared_data->rw_lock);
mess_with_data(shared_data);
func_b();
//g_rw_lock_writer_unlock(&shared_data->rw_lock);
}
void func_b() {
//g_rw_lock_writer_lock(&shared_data->rw_lock);
mess_with_data_again(shared_data);
//g_rw_lock_writer_unlock(&shared_data->rw_lock);
}
假设:
-
shared_data指向共享数据结构,线程间需要同步访问 -
shared_data->rw_lock是同步访问的读/写锁 -
func_a()和func_b()都可以从外部调用 -
mess_with_data()和mess_with_data_again()不是线程安全的,因此调用者在调用它们之前需要对数据持有写锁 - 它们不仅仅是单个函数调用,而是语句行,因此将
func_b()的主体复制到func_a()不是一种选择(代码重复,可维护性差) -
func_a()和func_b()的调用者无法直接访问锁,因此需要在后台进行锁定 - 不能将
func_b()的函数体(没有锁定/解锁)提取到func_a()和func_()调用的单独辅助函数中(它们分布在多个模块中,并且有层函数调用之间的抽象——事实上,func_a()并不直接通过名称调用func_b(),而是一个恰好解析为func_b()的指针。
我将如何解决这个问题?
【问题讨论】:
标签: multithreading glib