是否可以调用一个内存网格来刷新所有cpu缓存(在多处理器设置上),这样你就可以对使用非同步写入(即常规MOV)写入的同步读取和地址进行读取?
e.g。
// Thread 1
data[0] = 0x67230123
std::memcpy(ptr, data, data_size);
// Thread 2
// fence
if (*ptr == 0x67230123)
printf("Hello World")
我知道这有点奇怪并且有性能影响,但我有一个(可能)有充分理由需要这个。
答案 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");
}