我在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标准版。
答案 0 :(得分:1)
与评论中提到的每个人一样,在创建线程时,一般来说,想法是分离任务,从而提高现代多核架构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();
}