您缺少的部分是包含静态变量的静态内存。
该内存在程序启动时分配,并分配已知地址(在链接时确定)。所有线程都可以在不交换任何数据运行时访问此内存,因为地址被有效地硬编码。
一个简单的示例可能如下所示:
// Global variable.
std::atomic<int> common_var;
void thread1() {
common_var = compute_some_value();
}
void thread2() {
do_something();
int current_value = common_var;
do_more();
}
当然,全局值可能是一个指针,可以用来交换堆内存。生产者分配一些对象,消费者获取并使用它们。
// Global variable.
std::atomic<bool> produced;
SomeData* data_pointer;
void producer_thread() {
while (true) {
if (!produced) {
SomeData* new_data = new SomeData();
data_pointer = new_data;
// Let the other thread know there is something to read.
produced = true;
}
}
}
void consumer_thread() {
while (true) {
if (produced) {
SomeData* my_data = data_pointer;
data_pointer = nullptr;
// Let the other thread know we took the data.
produced = false;
do_something_with(my_data);
delete my_data;
}
}
}
请注意:这些不是良好的并发代码示例,但它们显示了总体思路,没有太多混乱。