c++ - Boost线程问题,当一个线程与另一个线程没有相同的拷贝时如何共享变量?

标签 c++ multithreading boost shared-variable

这可能是一个愚蠢的问题,但我确实在整个互联网上搜索了有关变量的信息,并找到了与互斥体和竞争条件、锁等相关的所有内容;但似乎无法解决这个简单的问题。

基本上下面的代码创建了两个线程,在每个线程中,变量 shared_int 被更改为表示它所在的线程。线程单独运行,类本身似乎有两个实例两个不同线程中的相同变量shared_int?我遇到的问题是我希望这个变量在任一线程中都被更改并且也可读,但我也希望从一个线程中看到的 shared_int 的值在第二个线程中是相同的。这是代码

#include <boost/thread.hpp>

template <typename I>
class threaded
{
    private:

        I volatile shared_int;

    public:

        threaded();
        virtual ~threaded();
        bool inputAvailable();
        void thread_1();
        void thread_2();
};

template <typename I>
threaded<I>::threaded(){}

template <typename I>
threaded<I>::~threaded(){}

template <typename I>
bool threaded<I>::inputAvailable()
{
      struct timeval tv;
      fd_set fds;
      tv.tv_sec = 0;
      tv.tv_usec = 0;
      FD_ZERO(&fds);
      FD_SET(STDIN_FILENO, &fds);
      select(STDIN_FILENO + 1, &fds, NULL, NULL, &tv);

      return (FD_ISSET(0, &fds));
}

template <typename I>
void threaded<I>::thread_1()
{
    shared_int = 1;

    while(!inputAvailable())
    {
        std::cout<<"threaded::thread_1 shared_int "<<this->shared_int<<std::endl;
        boost::this_thread::sleep_for( boost::chrono::milliseconds{ 9000});
    };
}

template <typename I>
void threaded<I>::thread_2()
{
    shared_int = 2;

    while(!inputAvailable())
    {
        std::cout<<"threaded::thread_2 shared_int "<<this->shared_int<<std::endl;
        boost::this_thread::sleep_for( boost::chrono::milliseconds{ 10000});
    };
}

int main()
{
    boost::thread_group thread;
    threaded< int> threads;

    thread.add_thread( new boost::thread( boost::bind( &threaded<int>::thread_1, threads)));
    thread.add_thread( new boost::thread( boost::bind( &threaded<int>::thread_2, threads)));

    thread.join_all();

    return 0;
}

最佳答案

下面这段代码似乎确实解决了这个问题。它使用 boost::shared_ptr 但它也适用于常规指针;无论哪种方式!我仍然想要一个按值传递对象而不是指针的解决方案,只是为了它的 hell ,但指针现在工作。

#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>

template <typename I>
class threaded
{
    private:

        I volatile shared_int;

    public:

        threaded();
        virtual ~threaded();
        bool inputAvailable();
        void thread_1();
        void thread_2();
};

template <typename I>
threaded<I>::threaded(){}

template <typename I>
threaded<I>::~threaded(){}

template <typename I>
bool threaded<I>::inputAvailable()
{
      struct timeval tv;
      fd_set fds;
      tv.tv_sec = 0;
      tv.tv_usec = 0;
      FD_ZERO(&fds);
      FD_SET(STDIN_FILENO, &fds);
      select(STDIN_FILENO + 1, &fds, NULL, NULL, &tv);

      return (FD_ISSET(0, &fds));
}

template <typename I>
void threaded<I>::thread_1()
{
    shared_int = 1;

    while(!inputAvailable())
    {
        std::cout<<"threaded::thread_1 shared_int "<<this->shared_int<<std::endl;
        boost::this_thread::sleep_for( boost::chrono::milliseconds{ 9000});
    };
}

template <typename I>
void threaded<I>::thread_2()
{
    shared_int = 2;

    while(!inputAvailable())
    {
        std::cout<<"threaded::thread_2 shared_int "<<this->shared_int<<std::endl;
        boost::this_thread::sleep_for( boost::chrono::milliseconds{ 10000});
    };
}

int main()
{
    boost::thread_group thread;
    boost::shared_ptr< threaded <int> > threads{ new threaded <int>};

    thread.add_thread( new boost::thread( boost::bind( &threaded<int>::thread_1, threads)));
    thread.add_thread( new boost::thread( boost::bind( &threaded<int>::thread_2, threads)));

    thread.join_all();
    threads.reset();

    return 0;
}

关于c++ - Boost线程问题,当一个线程与另一个线程没有相同的拷贝时如何共享变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44572774/

相关文章:

c++ - 使用 Visual Assist X 创建 C++ 实现(一次所有函数)

C++ 生成文件 3 个文件

c++ - 亚信 : usage of self shared pointer in the examples

c++ - 如何在多个处理器上运行 boost::threads?

c++ - 添加 #include <string> 时出现奇怪的错误

c++ - 用于折叠 C++ 代码的 Visual Studio 插件

java - 如何管理 M 个线程(每个任务 1 个)确保同时只有 N 个线程。 N < M. 在 Java 中

java - 如何在Java代码中启动一组线程

C# 后台 worker : What way to periodically update a PictureBox?

C++ Mongodb 驱动程序 v2.2 scons 在 Linux 上安装失败