两个线程之间的列表共享
List share between two threads
我想在 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
这很好用,但是我不确定我使用的是同一把锁吗?我的主管希望我在代码中有明确的 Lock/Unlock。至少如果我可以使用相同的互斥量?
非常感谢你帮助我
Ted 的评论很重要,您正在使用的是线程,而不是进程。进程不共享内存(除了使用共享内存,但你想避免这种情况)。线程彼此共享它们的整个内存 space。
您还提到您的主管希望您使用 unlock/lock 部分。您可以通过调用:
list_mutex.lock()
... critical section ...
list_mutx.unlock()
但是您已经通过构建 lock_guard
隐含地执行了此操作。 lock_guard
在创建时锁定并在当前作用域结束时解锁。
如 Ted 所述,您需要删除 list_mutex 的第二个声明(在 main 内)。
我想在 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
这很好用,但是我不确定我使用的是同一把锁吗?我的主管希望我在代码中有明确的 Lock/Unlock。至少如果我可以使用相同的互斥量?
非常感谢你帮助我
Ted 的评论很重要,您正在使用的是线程,而不是进程。进程不共享内存(除了使用共享内存,但你想避免这种情况)。线程彼此共享它们的整个内存 space。
您还提到您的主管希望您使用 unlock/lock 部分。您可以通过调用:
list_mutex.lock()
... critical section ...
list_mutx.unlock()
但是您已经通过构建 lock_guard
隐含地执行了此操作。 lock_guard
在创建时锁定并在当前作用域结束时解锁。
如 Ted 所述,您需要删除 list_mutex 的第二个声明(在 main 内)。