来自c ++多线程程序的输出不一致

时间:2016-09-28 03:08:23

标签: c++ multithreading

我在C ++中有以下程序:

// multithreading01.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <string>
#include <iostream>
#include <process.h>

using namespace std;

bool threadFinished = false;

struct params {

    string aFile;
    bool tf;

};

void WriteToFile(void *p)
{
    params* a = (params*)p;
    cout<<a->aFile<<endl;
    a->tf = true;
    _endthread();
}

int main(int argc, char* argv[])
{
    params *param01 = new params;
    params *param02 = new params;

    param01->aFile = "hello from p1";
    param01->tf = false;
    param02->aFile = "hello from p2";
    param02->tf = false;

    _beginthread(WriteToFile,0,(void *) param01);
    _beginthread(WriteToFile,0,(void *) param02);

    while(!param01->tf || !param02->tf)
    {

    }
    cout << "Main ends" << endl;
    system("pause");
    return 0;
}

但是,我得到了不一致的输出,例如

输出1:

你好,来自p1 你好,来自p2

输出2:

你好,来自p2的p1hello

输出3:

来自p1的p2ello的hhello

如何从此代码获得一致的输出?我使用的是Visual C ++ 6.0标准版。

1 个答案:

答案 0 :(得分:1)

阅读此small writeup

与评论中提到的每个人一样,在创建线程时,一般来说,想法是分离任务,从而提高现代多核架构CPU的性能,每个核心可以有一个线程。

如果你想从两个不同的线程访问相同的资源(在你的情况下是相同的文件),那么你需要确保从两个线程同时访问不会发生,否则你会看到你看到的问题。

通过使用某些锁保护共享资源(例如POSIX locks或您可以选择特定于平台的锁实现),您可以提供安全的同步访问。

初学者常犯的错误是他们锁定了代码&#34;不是&#34;资源&#34;。

不要这样做:

void WriteToFile(void *p)
{
    pthread_mutex_lock(var); //for example only
    params* a = (params*)p;
    cout<<a->aFile<<endl;
    a->tf = true;
    _endthread();
    pthread_mutex_unlock(var); //for example only
}

您应该锁定资源

struct params {
    lock_t lock; //for example only not actual code
    string aFile;
    bool tf;    
};

void WriteToFile(void *p)
{
    params* a = (params*)p;
    pthread_mutex_lock(a->lock); //Locking params here not the whole code.
    cout<<a->aFile<<endl;
    a->tf = true;
    pthread_mutex_unlock(a->lock); //Unlocking params
    _endthread();
}