首页 > 解决方案 > 两个线程之间的列表共享

问题描述

我想在 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

这很好,但是我不确定我使用的是同一个锁吗?我的主管希望我在代码中明确锁定/解锁。至少如果我可以使用相同的互斥锁?

非常感谢你帮助我

标签: c++multithreadingmutexlocks

解决方案


Ted 的评论很重要,您使用的是线程,而不是进程。进程不共享内存(除了使用共享内存,但您想避免这种情况)。线程彼此共享它们的整个内存空间。

您还提到您的主管希望您使用解锁/锁定部分。你可以通过调用来做到这一点:

list_mutex.lock()
... critical section ...
list_mutx.unlock()

但是您已经通过构造一个lock_guard. lock_guard创建时锁定并在当前范围结束时解锁。

正如 Ted 所说,您需要删除 list_mutex 的第二个声明(在 main 内)。


推荐阅读