Boost线程不会正确增加值

Posted

技术标签:

【中文标题】Boost线程不会正确增加值【英文标题】:Boost thread won't increase the value correctly 【发布时间】:2013-03-05 16:21:25 【问题描述】:

所以,我的代码似乎不起作用:(下面有更多详细信息)

#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <Windows.h>

using namespace std;

boost::mutex m1,m2;



void * incr1(int thr, int& count) 
    for (;;) 
    m1.lock();
    ++count;
    cout << "Thread " << thr << " increased COUNT to: " << count << endl;

    m1.unlock();
    //Sleep(100);

        if (count == 10) 
        break;
        
    
    return NULL;


int main()     
    int count = 0;

    boost::thread th1(boost::bind(incr1,1,count));
    boost::thread th2(boost::bind(incr1,2,count));

    th1.join();
    th2.join();

    system("pause");
    return 0;

基本上,它有一个接受两个参数的函数:一个数字(以区分哪个线程调用它)和一个通过引用传递的整数变量“count”。 这个想法是每个线程都应该在运行时增加 count 的值。 但是,结果是它增加了自己的 count 版本,所以结果是:

Thread 1 increased count to 1
Thread 2 increased count to 1
Thread 1 increased count to 2
Thread 2 increased count to 2
Thread 1 increased count to 3
Thread 2 increased count to 3

而不是每个线程将计数增加到下一个数字:

Thread 1 increased count to 1
Thread 2 increased count to 2
Thread 1 increased count to 3
Thread 2 increased count to 4
Thread 1 increased count to 5
Thread 2 increased count to 6

如果我通过简单地调用此函数两次来运行此代码,它会按预期工作。如果我使用线程,它不会。

这里是初学者。关于我为什么愚蠢的任何见解?

【问题讨论】:

【参考方案1】:

boost::bind 没有将 int 解析为引用。您需要使用参考包装器:

boost::bind( incr1, 1, boost::ref(count) );

【讨论】:

【参考方案2】:

因为你需要使用boost::ref 来通过boost::bind 引用传递一些东西。

boost::thread th1(boost::bind(incr1,1,boost::ref(count)));

【讨论】:

以上是关于Boost线程不会正确增加值的主要内容,如果未能解决你的问题,请参考以下文章

在 boost 线程上调用抽象函数,不会在 interrupt_point 中断

单线程Boost死锁

尝试链接 Boost 1.52 线程

Boost asio程序在多线程上崩溃

使用 asio 提升线程池:线程随机不执行

如何从 boost log sink 组织线程安全读取?