【问题标题】:C++ threads - non-shared membersC++ 线程 - 非共享成员
【发布时间】:2021-03-18 03:00:07
【问题描述】:

我有客户端类:

class Client
{
    std::vector<char> buffer;

    //actually these are asio socket and waitable_timer but that's beside the point
    Socket socket;
    Timer timer;

    public:
    void send_request(std::string req); //sends request in new thread and immediately returns
};

如果我没记错的话,buffersockettimer是线程间共享的。现在我希望 socketbuffer 在线程之间共享,以便它们共享连接并读入同一个缓冲区。但我希望每个线程都有自己的定时器。有没有比在 send_request(std::string) 函数中本地创建计时器更好的方法,然后通过参数将其传递给其他函数(由 send_request 调用的函数) ?请注意,我可以在每个函数中创建新的计时器,然后在最后销毁它(因为每个函数都设置截止日期,读取数据并调用另一个函数,该函数设置独立于前一个截止日期的新截止日期)但是使用 asio 我无法让它运行几个小时后,我也没有看到它以这种方式使用过,所以认为这不是一种选择。

【问题讨论】:

    标签: c++ multithreading tcpclient


    【解决方案1】:

    您可以使用std::mutex&lt;mutex_obj&gt;.lock() 锁定对象,&lt;mutex_obj&gt;.unlock 解锁对象。

    【讨论】:

    • 我不太明白这对我有什么帮助。我可以使用互斥锁来保护共享对象,但问题是线程之间是否可以共享一些成员。
    • Re,“是否有可能在线程之间共享一些成员,而另一些则不能。”如果多个线程访问一个变量,则该变量是“共享的”,如果只有一个线程访问它,则它不是共享的。那么,您要问的是,如果某个变量只能由一个线程访问,是否可以编写程序?是的。这是可能的。
    • @user680891 所以将套接字和缓冲区设置为静态。
    • 还要写class Client
    【解决方案2】:

    您可以将ClientConnection 类的单个实例与socketbuffer 字段以及Session 类的多个实例(与timer 字段)链接到@ 987654327@ 实例。

    顺便说一句,我不确定您如何在多个线程之间有意义地共享单个套接字和缓冲区。

    【讨论】:

      猜你喜欢
      • 2018-12-30
      • 1970-01-01
      • 2011-04-06
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多