【发布时间】:2015-01-28 13:40:09
【问题描述】:
特别是,我想设置一个函数指针的值。为简单起见,我想从多个线程中多次执行此操作,但始终以这样的简单方式:
typedef void (*F)();
F f = 0;
void foo()
{
}
// called many times from multiple threads
void set()
{
f = &foo;
}
int main()
{
set(); // also other threads can invoke it at any time
f();
return 0;
}
因此,函数指针最初为 NULL,然后在第一次执行代码时变为 &foo。我想知道是否由于任何非原子写入操作,函数指针可能会被破坏。
保证设置后第一次读取。
编辑:我澄清一下:
- 我使用函数指针的主要原因是为了消除模块之间的一些依赖关系。这是一个大型实际项目的一小部分。我真的不能直接调用'foo'。
- 我知道如何编程,我不需要关于互斥锁之类的基本信息。我的问题是没有互斥锁是否安全。
- 在代码中保证没有其他线程将指针设置为 &foo 以外的任何东西。
【问题讨论】:
-
你能发布一些现实的,但最少的代码吗?
-
即使它是原子的,多个线程更改函数指针意味着调用该函数的人不知道实际会调用什么。
-
@juanchopanza:我扩展了示例代码,让它更完整。
-
@Chad:关键是无论谁调用它都可以确定,它早先被设置为“&foo”。
-
除非另一个线程在第一个线程使用它之前也设置它
&bar。
标签: c++ thread-safety