CVI多线程数据保护(安全队列)

本文介绍了一个使用两个线程进行数据交换的例子,其中一个线程负责生成数据并将其安全地写入队列,另一个线程则从该队列中读取数据并显示出来。通过Windows API函数实现线程间的数据安全传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个线程产生数据,加入安全队列;一个线程显示数据,读取安全队列。

#include <windows.h>
#include <stdio.h>  
#include <utility.h>
int CVICALLBACK ThreadFunction (void *functionData);
int CVICALLBACK ThreadFunction1 (void *functionData);
int threadID;
int threadID1;

static int startflag = 0;
static int startflag1 = 0;
static CmtTSQHandle	g_timerQueueHdl = 0;

BOOL SetConsoleColor(WORD wAttributes)  
{  
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);  
    if (hConsole == INVALID_HANDLE_VALUE)  
        return FALSE;     
    return SetConsoleTextAttribute(hConsole, wAttributes);  
} 
int main()  
{
	if (CmtNewTSQ (2, sizeof(long), OPT_TSQ_DYNAMIC_SIZE,&g_timerQueueHdl) < 0)
		return -1;
	startflag = 1;
	startflag1 = 1;
		SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);    
	CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,ThreadFunction1 ,NULL ,&threadID1);

	CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,ThreadFunction ,NULL ,&threadID);	
	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);
	CmtDiscardTSQ (g_timerQueueHdl);
}
int CVICALLBACK ThreadFunction (void *functionData)
{
	long g_nNum[2] = {0,100}; 
	while (startflag)
	{
		Sleep(100);
	    
		SetConsoleColor(FOREGROUND_GREEN); 
		g_nNum[0]++;
		g_nNum[1]++;
		printf("线程安全队列1载入%d\n", g_nNum[0]); 
   		printf("线程安全队列2载入%d\n", g_nNum[1]);
		SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);  
		CmtWriteTSQData (g_timerQueueHdl, g_nNum, 2, TSQ_INFINITE_TIMEOUT,NULL);
		Sleep(0);
	}
    return 0;  
}

int CVICALLBACK ThreadFunction1 (void *functionData)
{
    long	   g_nNum1[2];
	while (startflag1)
	{
		Sleep(100);
		CmtReadTSQData (g_timerQueueHdl, g_nNum1, 2,TSQ_INFINITE_TIMEOUT, 0);
		printf("线程安全队列1读取%d\n", g_nNum1[0]); 
   		printf("线程安全队列2读取%d\n", g_nNum1[1]);
		Sleep(0);
	}
    return 0;  
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值