关于C++11多线程计算的问题,请各位大神帮忙解答一下,小女子感激不尽~~

//在以下简单的程序中,运行结果应该是20000000,然而在GCC编译运行后输出的数介于一千万到两千万之间,而且每次运行的结果都不同,这是为什么呢(┬_┬)//请帮忙更... // 在以下简单的程序中,运行结果应该是20000000,然而在GCC编译运行后输出的数介于一千万到两千万之间,而且每次运行的结果都不同,这是为什么呢(┬_┬)
// 请帮忙更正一下,非常感谢!

#include <iostream>

#include <thread>

int count=0;

void test()
{
for(int i=0;i<10000000;i++)

count++;

}

int main()
{
thread t1(test), t2(test);
t1.join();

t2.join();

std::cout<<count<<std::endl;

return 0;

}
展开
 我来答
wdwarf
推荐于2016-03-24 · 超过22用户采纳过TA的回答
知道答主
回答量:72
采纳率:0%
帮助的人:42.4万
展开全部

线程对象在声明之后就会立即执行。

thread t1(test), t2(test);//这里两个线程同时启动了,而你的线程函数没加锁

方法一:

//主函数应该这样写
int main()
{
    thread t1(test);
    t1.join();
 
    thread t2(test);
    t2.join();
 

    std::cout<<count<<std::endl;
 

    return 0;
}

方法二:

//给线程函数加上锁
#include <iostream>
#include <thread>
#include <mutex>
 
using namespace std;
 

int count=0;
mutex gMutex;
 

void test()
{
    lock_guard<mutex> lk (gMutex);
    for(int i=0;i<10000000;i++)
 

        count++;
 

}
 

int main()
{
    thread t1(test), t2(test);
    t1.join();
 

    t2.join();
 

    std::cout<<count<<std::endl;
 

    return 0;
 

}
liu_x_s
2015-06-06 · 超过28用户采纳过TA的回答
知道答主
回答量:93
采纳率:81%
帮助的人:23.5万
展开全部
因为count变量不是线程安全的,因此多线程并发时可能出现读脏数据。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式