两个线程之间的列表共享

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 它似乎更容易使用

以上是关于两个线程之间的列表共享的主要内容,如果未能解决你的问题,请参考以下文章

如何在两个线程之间共享数据

在两个线程之间共享deadline_timer

在两个线程之间共享 QAxObject?

不要同时在两个线程之间共享相同的套接字

在两个线程之间使用 LinkedBlockingQueue 是不是意味着我们不需要同步它们对共享数据的访问?

两个活动之间的共享数组列表不起作用