仅跨 2 个线程进行 NULL 检查是线程安全的吗?
Is NULL checking across ONLY 2 threads thread-safe?
给定以下场景:
- 2 个线程(不多也不少)
- 一个共享变量(假设是一个 void *)
- 一个线程只写入一次变量(这是有保证的)
- 而另一个线程负责读取变量
让 reader 线程检查变量的 null 是否线程安全?明确地在 C 程序中?
示例代码:
线程 1:
void initOnStartup()
{
ptr = malloc(10);
}
线程 2:
void waitingForValue()
{
while(!ptr);
}
否,因为赋值 =
操作不是原子操作。
答案就在那里:
Is changing a pointer considered an atomic action in C?
不幸的是它不是。想想 16 位 x86 平台上的远指针。
它不是原子的。较新版本的 C(和 c++)提供以下内容。
http://en.cppreference.com/w/c/atomic/atomic_store
void atomic_store( volatile A* obj , C desired); // (since C11)
void atomic_store_explicit( volatile A* obj, C desired, memory_order order ); // (since C11)
给定以下场景:
- 2 个线程(不多也不少)
- 一个共享变量(假设是一个 void *)
- 一个线程只写入一次变量(这是有保证的)
- 而另一个线程负责读取变量
让 reader 线程检查变量的 null 是否线程安全?明确地在 C 程序中?
示例代码:
线程 1:
void initOnStartup()
{
ptr = malloc(10);
}
线程 2:
void waitingForValue()
{
while(!ptr);
}
否,因为赋值 =
操作不是原子操作。
答案就在那里: Is changing a pointer considered an atomic action in C? 不幸的是它不是。想想 16 位 x86 平台上的远指针。
它不是原子的。较新版本的 C(和 c++)提供以下内容。 http://en.cppreference.com/w/c/atomic/atomic_store
void atomic_store( volatile A* obj , C desired); // (since C11)
void atomic_store_explicit( volatile A* obj, C desired, memory_order order ); // (since C11)