同步读取非同步写入

时间:2015-10-29 11:35:35

标签: c++ gcc x86

是否可以调用一个内存网格来刷新所有cpu缓存(在多处理器设置上),这样你就可以对使用非同步写入(即常规MOV)写入的同步读取和地址进行读取?

e.g。

// Thread 1
data[0] = 0x67230123
std::memcpy(ptr, data, data_size);

// Thread 2
// fence
if (*ptr == 0x67230123)
  printf("Hello World")

我知道这有点奇怪并且有性能影响,但我有一个(可能)有充分理由需要这个。

2 个答案:

答案 0 :(得分:0)

如果我们谈论Linux,你可以使用rmb()和wmb()函数,它们分别是读写内存屏障。

您的代码可能如下所示:

// Thread 1
std::memcpy(ptr, data, data_size);
wmb();

// Thread 2
smp_rmb();
if (*(ptr + 32) == 0x67230123)
    printf("Hello World")

wmb()强制Thread1将所有存储在CPU缓存中的值写入RAM。并且rmb()强制Thread2将所有需要的值从RAM加载到CPU缓存,以便在以下语句中使用。

答案 1 :(得分:0)

使用条件变量:

std::mutex mutex;
std::condition_variable magic_event;

//thread 1
std::memcpy(ptr, data, data_size);
if(*(ptr + 32) == 0x67230123) {
    std::lock_guard<std::mutex> lock(mutex);
    magic_event.notify_one();
}

//thread 2
{
    std::unique_lock<std::mutex> thread_lock(mutex);
    magic_event.wait(thread_lock);
    printf("Hello World");
}
相关问题