c++ - 两个线程之间的列表共享
问题描述
我想在 C++ 中在两个线程之间共享一个列表。我想非常简单,不要使用 FIFO 或共享内存,所以我只使用互斥锁和锁。
我试过这种方式及其工作:
#include <string.h>
#include <mutex>
#include <iostream>
#include <thread>
#include <list>
std::list<int> myList;
std::mutex list_mutex;
void client(){
std::lock_guard<std::mutex> guard(list_mutex);
myList.push_back(4);
};
void server(){
std::lock_guard<std::mutex> guard(list_mutex);
myList.push_back(2);
};
void print(std::list<int> const &list)
{
for (auto const& i: list) {
std::cout << i << "\n";
}
};
int main(int ac, char** av)
{
std::mutex list_mutex;
std::thread t1(client);
std::thread t2(server);
t1.join();
t2.join();
print(myList);
std::cout<<"test";
return 0;
}
它打印我这个
24test
这很好,但是我不确定我使用的是同一个锁吗?我的主管希望我在代码中明确锁定/解锁。至少如果我可以使用相同的互斥锁?
非常感谢你帮助我
解决方案
Ted 的评论很重要,您使用的是线程,而不是进程。进程不共享内存(除了使用共享内存,但您想避免这种情况)。线程彼此共享它们的整个内存空间。
您还提到您的主管希望您使用解锁/锁定部分。你可以通过调用来做到这一点:
list_mutex.lock()
... critical section ...
list_mutx.unlock()
但是您已经通过构造一个lock_guard
. lock_guard
创建时锁定并在当前范围结束时解锁。
正如 Ted 所说,您需要删除 list_mutex 的第二个声明(在 main 内)。
推荐阅读
- google-cloud-functions - Algolia + Firebase 云函数:index.browseObjects 不是函数
- facebook - Facebook CDN CORS 问题
- python - 在python中的某个日期之后删除数据
- android-studio - 如何使用 gradle 版本修复错误循环?
- typescript - 使用 Cypress Typescript 类型
- javascript - 如何同时解析代码和 JSDoc 注释
- php - 错误:419|页面已过期(Laravel 6.0 -Mysql)
- flutter - 如何将配置值传递给在 Flutter 集成测试中启动的应用程序?
- excel - 使用VBA有条件地在excel中将值从一张表引用到另一张表
- ios - 防止视图控制器在状态栏下扩展