【发布时间】:2015-09-17 18:46:09
【问题描述】:
假设您有一个正在运行的多线程程序。就我而言,该程序使用 std::thread ,但我想这并不重要。现在每个线程都需要写入某个全局缓冲区,但保证它们永远不会写入该缓冲区中的相同内存地址。问题:
- 它是线程安全的吗?
- 效率高吗?我的意思是,如果您有 8 个线程,它们可能会访问此缓冲存储器的不同部分。这可能会导致很多缓存未命中?
上面的代码只是我所说的“线程写入同一个缓冲区但从不在同一个地址”的一个示例(尽管在我的情况下缓冲区要大得多,并且线程访问该缓冲区的非常不同的部分) .
int *buffer = new buffer[10];
for (int i = 0; i < 10; ++i) {
threads[k] = std::thread(threadFunc, std::ref(buffer), i);
}
void threadFunc(int *&buffer, const int &threadId)
{
buffer[threadId] = threadId;
}
【问题讨论】:
-
它绝对是安全的,但你有一个很好的观点,即缓存的一部分可能会依次为每个线程重新加载。我想你需要做一些时间测试。我想您可以安排所有线程与内存地址紧密绑定,确保所有线程在允许它们全部移动到下一个(隔离)块之前完成处理一个(隔离)块。不过听起来有点复杂。
标签: c++ multithreading c++11