CVI多线程数据保护(多个线程操作同一安全变量)

有网友提出多个线程操作多个变量不能明确显示是否做到异步操作,现在我们来看下多个线程操作同一变量,是不是有序的进行呢?

#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;  
} 


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值