两个线程之间的列表共享

3
我希望您能在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。至少我能否使用相同的互斥锁?

非常感谢你的帮助。


@TedLyngmo 我现在知道该怎么做了,我也知道不必发送感谢消息,但你真的很好,对于像我这样的新手来说,能遇到友善和有礼貌的人并不常见。 - undefined
谢谢!不客气!:) - undefined
1个回答

1
泰德的评论很重要,你正在处理的是线程而不是进程。进程不共享内存(除了使用共享内存,但你想避免这种情况)。线程彼此共享整个内存空间。
你还提到你的主管希望你使用解锁/锁定部分。你可以通过调用以下命令来实现:
list_mutex.lock()
... critical section ...
list_mutx.unlock()

通过构造一个lock_guard,您已经自动执行了这个操作。当您创建lock_guard时,它会锁定并在当前作用域结束时解锁。

正如Ted所指出的,您需要删除main函数内部的第二个list_mutex声明。


谢谢Jack,但是在客户端和服务器两个线程中使用std::lock_guardstd::mutex guard(list_mutex)是否有用? - undefined
@TedLyngmo 我认为他实际上无法删除std::mutex,因为lock_guard正在使用它。他们像在list_mutex.lock()中一样使用它,但是在构造函数和析构函数中执行(list_mutex.unlock())。 - undefined
1
@Jack 在 main 函数中声明的互斥锁没有被使用到任何地方。演示 - undefined
1
@TedLyngmo 哦,我明白你的意思了。是的,et11enne,你需要删除对list_mutex的重复声明(第二次出现在main函数中)。我会修改答案。 - undefined
1
@Jack谢谢您的支持,所以我移除了lock_guard并将其替换为lock和unlock...我更喜欢lock_guards,因为它似乎更容易使用。 - undefined
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接