为什么在相同的流中具有相同的延迟会影响结果?
Why does having the same delay in the same streams affect the result?
我有2个修改全局变量的非同步线程。每个线程有 12 次迭代。在修改命令之前,每个流都有 1 毫秒的延迟。结果,全局变量等于 112,这是合乎逻辑的,因为流同时修改它,但是如果你删除两个流中的延迟,那么其中一个会领先于另一个流,以便另一个流接收到全局变量的当前值。为什么在启用延迟时会发生这种情况?
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <omp.h>
using namespace std;
int global = 100;
HANDLE ht1, ht2;
DWORD WINAPI ThreadProc1(LPVOID lpParameter ) {
int i, j;
for (j=1; j <= 12; j++) {
i = global;
i++;
Sleep (1); //Delay before modifying global variable
global = i;
printf_s( "%4s %4d \n", " 1 th", i );
}
return 0;
}
DWORD WINAPI ThreadProc2 (LPVOID lpParameter) {
int i, j;
for (j=1; j <= 12; j++) {
i = global;
i++;
Sleep (1); //Delay before modifying global variable
global = i;
printf_s( "%4s %4d %4d \n", " 2 th", i, j );
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[]) {
HANDLE msh[2];
ht1 = CreateThread(NULL, 0, &ThreadProc1, NULL, 0, NULL);
ht2 = CreateThread(NULL, 0, &ThreadProc2, NULL, 0, NULL);
msh[0] = ht1;
msh[1] = ht2;
WaitForMultipleObjects(2,msh,TRUE, INFINITE);
return 0;
}
根据你操作系统的线程调度,加延迟时,两个线程都执行i = global
,两个线程的全局值是一样的。所以只是增加了12,没有延迟的情况下,代码:
i = global;
i++;
global = i;
没有被打断,相当于这里global++
。所以结果是 100 + 12*2 = 124.
我有2个修改全局变量的非同步线程。每个线程有 12 次迭代。在修改命令之前,每个流都有 1 毫秒的延迟。结果,全局变量等于 112,这是合乎逻辑的,因为流同时修改它,但是如果你删除两个流中的延迟,那么其中一个会领先于另一个流,以便另一个流接收到全局变量的当前值。为什么在启用延迟时会发生这种情况?
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <omp.h>
using namespace std;
int global = 100;
HANDLE ht1, ht2;
DWORD WINAPI ThreadProc1(LPVOID lpParameter ) {
int i, j;
for (j=1; j <= 12; j++) {
i = global;
i++;
Sleep (1); //Delay before modifying global variable
global = i;
printf_s( "%4s %4d \n", " 1 th", i );
}
return 0;
}
DWORD WINAPI ThreadProc2 (LPVOID lpParameter) {
int i, j;
for (j=1; j <= 12; j++) {
i = global;
i++;
Sleep (1); //Delay before modifying global variable
global = i;
printf_s( "%4s %4d %4d \n", " 2 th", i, j );
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[]) {
HANDLE msh[2];
ht1 = CreateThread(NULL, 0, &ThreadProc1, NULL, 0, NULL);
ht2 = CreateThread(NULL, 0, &ThreadProc2, NULL, 0, NULL);
msh[0] = ht1;
msh[1] = ht2;
WaitForMultipleObjects(2,msh,TRUE, INFINITE);
return 0;
}
根据你操作系统的线程调度,加延迟时,两个线程都执行i = global
,两个线程的全局值是一样的。所以只是增加了12,没有延迟的情况下,代码:
i = global;
i++;
global = i;
没有被打断,相当于这里global++
。所以结果是 100 + 12*2 = 124.