Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列出两个线程之间的共享 我希望C++在两个线程之间共享一个列表。我想非常简单,不采取先进先出或共享内存,所以我只是使用互斥锁和锁_C++_Multithreading_Mutex_Locks - Fatal编程技术网

列出两个线程之间的共享 我希望C++在两个线程之间共享一个列表。我想非常简单,不采取先进先出或共享内存,所以我只是使用互斥锁和锁

列出两个线程之间的共享 我希望C++在两个线程之间共享一个列表。我想非常简单,不采取先进先出或共享内存,所以我只是使用互斥锁和锁,c++,multithreading,mutex,locks,C++,Multithreading,Mutex,Locks,我试过这种方法,而且效果很好: #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>

我试过这种方法,而且效果很好:

#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;
    }
这很好,它可以工作,但是我不确定我是否使用了相同的锁?我的主管希望我在代码中有明确的锁定/解锁。至少如果我可以使用相同的互斥锁?


非常感谢您帮助我

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

您还提到您的主管希望您使用解锁/锁定部分。您可以拨打以下电话:

list_mutex.lock()
... critical section ...
list_mutx.unlock()
但是您已经通过构造一个
锁保护
隐式地实现了这一点。
lock\u-guard
在创建时锁定,并在当前作用域的末尾解锁


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

您得到了我的投票,但您可以添加一个关于
std::mutex list_mutexmain
中声明的代码>。因为它没有使用过,所以可以删除。谢谢你,杰克,但是要执行std::lock\u guard(列出互斥);在客户端和服务器两个线程中都有用吗?@Jack在
main
中声明的互斥锁在任何地方都不使用@TedLyngmo啊,我明白你的意思了,是的,et11enne,你需要删除list_mutex的双重声明(主要是第二次),我会修改答案。@Jack感谢你的支持,所以我删除了锁防护装置,并将其替换为锁定和解锁。。。我推荐了锁具,看起来更容易找到use@TedLyngmo我现在知道该怎么办了,我也知道我不必发感谢信,但你真的很好,不像我这样有礼貌的好朋友。谢谢!不客气!:)
list_mutex.lock()
... critical section ...
list_mutx.unlock()