有网友提出多个线程操作多个变量不能明确显示是否做到异步操作,现在我们来看下多个线程操作同一变量,是不是有序的进行呢?
#include <windows.h>
#include <stdio.h>
#include <utility.h>
int CVICALLBACK ThreadFunction (void *functionData);
int CVICALLBACK ThreadFunction1 (void *functionData);
int CVICALLBACK ThreadFunction2 (void *functionData);
//int CVICALLBACK ThreadFunction3 (void *functionData);
int threadID;
int threadID1;
int threadID2;
long g_nNum = 0;
static int startflag = 0;
static int startflag1 = 0;
static int startflag2 = 0;
DefineThreadSafeScalarVar(long,g_nNum,0);
BOOL SetConsoleColor(WORD wAttributes)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (hConsole == INVALID_HANDLE_VALUE)
return FALSE;
return SetConsoleTextAttribute(hConsole, wAttributes);
}
int main()
{
Initializeg_nNum();
CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,ThreadFunction1 ,NULL ,&threadID1);
CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,ThreadFunction ,NULL ,&threadID);
CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,ThreadFunction2 ,NULL ,&threadID2);
startflag = 1;
startflag1 = 1;
startflag2 = 1;
CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE,threadID, OPT_TP_PROCESS_EVENTS_WHILE_WAITING);
CmtReleaseThreadPoolFunctionID (DEFAULT_THREAD_POOL_HANDLE, threadID);
CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE,threadID1, OPT_TP_PROCESS_EVENTS_WHILE_WAITING);
CmtReleaseThreadPoolFunctionID (DEFAULT_THREAD_POOL_HANDLE, threadID1);
CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE,threadID2, OPT_TP_PROCESS_EVENTS_WHILE_WAITING);
CmtReleaseThreadPoolFunctionID (DEFAULT_THREAD_POOL_HANDLE, threadID2);
Uninitializeg_nNum();
return 0;
}
int CVICALLBACK ThreadFunction (void *functionData)
{
long *g_nNumPtr;
while(startflag)
{
Sleep(0);//some work should to do
g_nNumPtr = GetPointerTog_nNum();
(*g_nNumPtr)++;
SetConsoleColor(FOREGROUND_GREEN);
printf("线程1操作数%d \n", *g_nNumPtr);
SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
ReleasePointerTog_nNum();
Sleep(500);//some work should to do
}
return 0;
}
int CVICALLBACK ThreadFunction2 (void *functionData)
{
long *g_nNumPtr;
while(startflag2)
{
Sleep(0);//some work should to do
g_nNumPtr = GetPointerTog_nNum();
(*g_nNumPtr)++;
SetConsoleColor(FOREGROUND_RED);
printf("线程3操作数%d \n", *g_nNumPtr);
SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
ReleasePointerTog_nNum();
// printf("全局资源值2为%d\n", g_nNum1);
Sleep(500);//some work should to do
}
return 0;
}
int CVICALLBACK ThreadFunction1 (void *functionData)
{
long *g_nNumPtr;
while(startflag1)
{
Sleep(0);//some work should to do
g_nNumPtr = GetPointerTog_nNum();
(*g_nNumPtr)++;
printf("线程2操作数%d \n", *g_nNumPtr);
ReleasePointerTog_nNum();
Sleep(500);//some work should to do
}
return 0;
}