两个线程之间的列表共享
Posted
技术标签:
【中文标题】两个线程之间的列表共享【英文标题】:List share between two threads 【发布时间】:2021-03-29 10:18:33 【问题描述】:我想在 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
这很好,但是我不确定我使用的是同一个锁吗?我的主管希望我在代码中有明确的锁定/解锁。至少如果我可以使用相同的互斥锁?
非常感谢你帮助我
【问题讨论】:
@TedLyngmo 我现在知道该怎么做,我也知道我不必发送感谢信息,但你真的很好,不像我这样有礼貌的人有这样的菜鸟。 谢谢!别客气! :) 【参考方案1】:Ted 的评论很重要,您使用的是线程,而不是进程。进程不共享内存(除了使用共享内存,但您想避免这种情况)。线程彼此共享其整个内存空间。
您还提到您的主管希望您使用解锁/锁定部分。你可以通过调用来做到这一点:
list_mutex.lock()
... critical section ...
list_mutx.unlock()
但是您已经通过构造lock_guard
隐式地做到了这一点。 lock_guard
在创建时锁定并在当前作用域结束时解锁。
正如 Ted 所说,您需要删除 list_mutex 的第二个声明(在 main 内)。
【讨论】:
你得到了我的投票,但你可以添加关于std::mutex list_mutex;
的注释,该注释在main
中声明。既然没用过,可以去掉。
谢谢杰克,但请做 std::lock_guard<:mutex> guard(list_mutex);在两个线程 client&&Serveur 中都有用吗?
@Jack 在main
中声明的互斥锁不会在任何地方使用。 demo
@TedLyngmo 啊我明白你的意思了,是的et11enne,你需要删除list_mutex的双重声明(第二次是main),我会修改答案。
@Jack 感谢您的支持,所以我删除了 lock_guard 并用 lock 和 unlock 替换它...我更喜欢 lock_guards 它似乎更容易使用以上是关于两个线程之间的列表共享的主要内容,如果未能解决你的问题,请参考以下文章