提升线程无法正确增加值

Boost thread won't increase the value correctly

本文关键字:增加值 线程      更新时间:2023-10-16

所以,我有这段代码似乎不起作用:(下面有更多细节)

#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

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

完全初学者在这里。你知道我为什么这么蠢吗?

这是boost::bind不将int解析为引用。您需要使用引用包装器,以便:

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

因为您需要使用boost::ref通过boost::bind通过引用传递某些内容。

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