C++ 使用互斥体正确编写的代码是否仍然易变?

C++ 使用互斥体正确编写的代码是否仍然易变?,c++,multithreading,stdthread,C++,Multithreading,Stdthread,我一直在用std::thread做一些非常基本的东西,没有任何特殊的原因,只是为了学习它。我认为我创建的简单示例中,很少有线程对相同的数据进行操作,在这样做之前相互锁定,效果很好,直到我意识到每次运行它时返回的值都是不同的,虽然彼此非常接近,但我很确定它们应该是相等的。我收到的一些价值观: 21.692524 21.699258 21.678871 21.705947 21.685744 我是否做错了什么,或者这种行为可能有潜在的原因 #include <string> #inc

我一直在用std::thread做一些非常基本的东西,没有任何特殊的原因,只是为了学习它。我认为我创建的简单示例中,很少有线程对相同的数据进行操作,在这样做之前相互锁定,效果很好,直到我意识到每次运行它时返回的值都是不同的,虽然彼此非常接近,但我很确定它们应该是相等的。我收到的一些价值观:

  • 21.692524
  • 21.699258
  • 21.678871
  • 21.705947
  • 21.685744
我是否做错了什么,或者这种行为可能有潜在的原因

#include <string>
#include <iostream>
#include <thread>
#include <math.h>
#include <time.h>
#include <windows.h>
#include <mutex>

using namespace std;

mutex mtx;
mutex mtx2;

int currentValue = 1;
double suma = 0;

int assignPart() {
    mtx.lock();
    int localValue = currentValue;
    currentValue+=10000000;
    mtx.unlock();
    return localValue;
}

void calculatePart()
{
    int value;
    double sumaLokalna = 0;
    while(currentValue<1500000000){
        value = assignPart();
        for(double i=value;i<(value+10000000);i++){
            sumaLokalna = sumaLokalna + (1/(i));
        }
        mtx2.lock();
        suma+=sumaLokalna;
        mtx2.unlock();
        sumaLokalna = 0;
    }
}

int main()
{
    clock_t startTime = clock();
    // Constructs the new thread and runs it. Does not block execution.
    thread watek(calculatePart);
    thread watek2(calculatePart);
    thread watek3(calculatePart);
    thread watek4(calculatePart);

    while(currentValue<1500000000){
        Sleep(100);
        printf("%-12d %-12lf \n",currentValue, suma);
    }
    watek.join();
    watek2.join();
    watek3.join();
    watek4.join();
    cout << double( clock() - startTime ) / (double)CLOCKS_PER_SEC<< " seconds." << endl;
    //Makes the main thread wait for the new thread to finish execution, therefore blocks its own execution.
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
互斥mtx;
互斥mtx2;
int currentValue=1;
双suma=0;
int赋值部分(){
mtx.lock();
int localValue=currentValue;
currentValue+=10000000;
mtx.unlock();
返回localValue;
}
void calculatePart()
{
int值;
双苏马洛卡纳=0;
而(currentValue您的循环

while(currentValue<1500000000){
    Sleep(100);
    printf("%-12d %-12lf \n",currentValue, suma);
}

加入线程后。

据我所知,这很好。您的输出似乎是执行所需的时间,这不太可能每次都是相同的,因为您正在生成多个线程,这些线程必须通过互斥体进行交互。您显示的值是
currentValue
的值?如果是,您是否应该打印f cur加入线程后的rentValue?通过“返回值”,您的意思是
suma
的最终值吗?您的代码没有打印该值;它打印各种中间值(可能是任何值,并且由于您在读取时没有锁定互斥锁,因此会给出未定义的行为),以及所花费的总时间(在不同的运行中会有所不同)。也许您可以更新代码以准确打印您所要求的内容。
while(currentValue)当我们读取currentValue时,它是否仍然是错误的:
while(currentValue
    printf("%-12d %-12lf \n",currentValue, suma);