线程间同步问题

时间:2021-03-27 18:09:45

int a[5];
HANDLE hMutex;
void thread(void *pParams)
{
int i,num=0;

while(num<10)
{
WaitForSingleObject(hMutex,INFINITE);
cout<<"thread begin"<<endl;
for(i=0;i<5;i++)
a[i]=num;
 cout<<"thread end"<<num<<endl;   
ReleaseMutex(hMutex);
num++;
}
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
hMutex=CreateMutex(NULL,FALSE,NULL);
    _beginthread(thread,0,NULL);
int i=0;

while(i++<10)
{
WaitForSingleObject(hMutex,INFINITE);
printf("%d %d %d %d %d\n",a[0],a[1],a[2],a[3],a[4],a[5]);
ReleaseMutex(hMutex);
}
return 0;


return nRetCode;
}

这个程序是从书上抄的,根本达不到线程同步的效果,我用的是vc6

5 个解决方案

#1


这个程序能保证数组内的数据一致,但是不能保证刚好数据内容变化之后打印数据。
我把main里的循环改成了100次,得到的是这个结果:
0 0 0 0 0
thread begin
thread end0
0 0 0 0 0
thread begin
thread end1
1 1 1 1 1
thread begin
thread end2
thread begin
thread end3
thread begin
thread end4
thread begin
thread end5
5 5 5 5 5
...
每次不一样的。

#2


为什么不是按顺序输出的呢?等待,释放,等待,释放,很有规律啊

#3


项目 属性 C/C++ 代码生成 运行库 选有多线程的选项。 
VC6 默认对控制台程序连接的C运行时库不支持多线程。也就是说VC6 默认的设置 C和c++的函数 不支持多线程

#4


晕,这就是同步的效果。受保护的代码总是在一起执行。你说的那个规律是由于CPU时间片切换的原因

#5


引用 2 楼 hailang19861202 的回复:
为什么不是按顺序输出的呢?等待,释放,等待,释放,很有规律啊

你这样写根本就不可能有规律,谁先抢到hMutex谁就运行

应该加个event,main函数等待event,线程函数赋值后SetEvent

#1


这个程序能保证数组内的数据一致,但是不能保证刚好数据内容变化之后打印数据。
我把main里的循环改成了100次,得到的是这个结果:
0 0 0 0 0
thread begin
thread end0
0 0 0 0 0
thread begin
thread end1
1 1 1 1 1
thread begin
thread end2
thread begin
thread end3
thread begin
thread end4
thread begin
thread end5
5 5 5 5 5
...
每次不一样的。

#2


为什么不是按顺序输出的呢?等待,释放,等待,释放,很有规律啊

#3


项目 属性 C/C++ 代码生成 运行库 选有多线程的选项。 
VC6 默认对控制台程序连接的C运行时库不支持多线程。也就是说VC6 默认的设置 C和c++的函数 不支持多线程

#4


晕,这就是同步的效果。受保护的代码总是在一起执行。你说的那个规律是由于CPU时间片切换的原因

#5


引用 2 楼 hailang19861202 的回复:
为什么不是按顺序输出的呢?等待,释放,等待,释放,很有规律啊

你这样写根本就不可能有规律,谁先抢到hMutex谁就运行

应该加个event,main函数等待event,线程函数赋值后SetEvent