`
444878909
  • 浏览: 638013 次
文章分类
社区版块
存档分类
最新评论

C++在多线程中使用UINT做循环判断变量的不确定性问题

 
阅读更多

先看下面一段代码

DWORD WINAPI ThreadProc(LPVOID lpParam);  
DWORD WINAPI ThreadProc2(LPVOID lpParam);  

DWORD g_dwThreadID;  
DWORD g_dwThreadID2;  

UINT g_nTickets = 300;  //int g_nTickets = 300;  //备注1
HANDLE g_hEvent = NULL;  

int main()  
{  
	cout << "Main thread is running." << endl;  
	
	HANDLE hHandle = CreateThread(NULL, 0, ThreadProc, NULL, 0, &g_dwThreadID);  
	HANDLE hHandle2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, &g_dwThreadID2);  
	CloseHandle(hHandle);   
	CloseHandle(hHandle2);  
	
	g_hEvent = CreateEvent(NULL, FALSE,  TRUE, NULL);  
	
	Sleep(4000);	//备注4
	system("pause");  
	return 0;  
}  

DWORD WINAPI ThreadProc(LPVOID lpParam)  
{   
	// cout << "No." << g_dwThreadID << " thread is running." << endl;  
	while (TRUE)  
	{  
		WaitForSingleObject(g_hEvent, INFINITE);  
		if (g_nTickets > 0)  
		{  
			Sleep(1);  //Sleep(1000)	//备注2
			cout << "No.1-" << g_dwThreadID << " sell ticket : " << g_nTickets << endl;  
			g_nTickets--;  
			SetEvent(g_hEvent);   
		}  
		else  
		{  
			SetEvent(g_hEvent);//没有这个ThreadProc2不能终止	//备注3
			break;  
		}  
	}  

	cout << "No.1- end" << endl;

	return 0;  
}  

DWORD WINAPI ThreadProc2(LPVOID lpParam)  
{  
	// cout << "No." << g_dwThreadID2 << " thread is running." << endl;  
	while (TRUE)  
	{  
		WaitForSingleObject(g_hEvent, INFINITE);  
		if (g_nTickets > 0)  
		{  
			Sleep(1);  //Sleep(1000)	//备注2
			cout << "No.2-" << g_dwThreadID2 << " sell ticket : " << g_nTickets << endl;  
			g_nTickets--;  
			SetEvent(g_hEvent);  
		}  
		else  
		{  
			SetEvent(g_hEvent);//同样的问题,没有这个ThreadProc不能终止		//备注3
			break;  
		}  
	}  

	cout << "No.2- end" << endl;
	return 0;  
}  

有兴趣的朋友可以试下这段代码有什么问题,当然能直接看出来问题的朋友,可以不用试了。

在里面有备注1、备注2、备注3和备注4。

首先什么不改,可以试一下。

改一下备注2,试一下。

改一下备注1试一下。

最后改一下备注3试一下。

备注4,这里可以用一个事件来控制,线程是否结束,用Sleep(4000);这样,当线程里改成Sleep(1000);的时候,进程已经结束,而线程还在运行。


这里有使用UINT类型作为循环变量引起的不确定性的问题,也有SetEvent没有使用不好引起的线程不能终止的问题。

更好的处理方式是使用多线程同步(比如临界区)来操作全局变量。

可参考:http://blog.csdn.net/wujunokay/article/details/12272581


转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/12262945




分享到:
评论

相关推荐

    基于c/c++的MFC的多线程

     在MFC程序中创建一个线程,宜调用AfxBeginThread函数。该函数因参数不同而具有两种重载版本,分别对应工作者线程和用户接口(UI)线程。  工作者线程 CWinThread *AfxBeginThread(  AFX_THREADPROC ...

    C++实现多线程查找文件实例

    主要是多线程的互斥 文件 的查找 多线程互斥的框架 代码如下://线程函数  UINT FinderEntry(LPVOID lpParam)  {   //CRapidFinder通过参数传递进来   CRapidFinder* pFinder = (CRapidFinder*)lpParam;   ...

    C++ 关于MFC多线程编程的注意事项

    在多线程编程中,最简单的方法,无非就是利用 AfxBeginThread 来创建一个工作线程,看一下这个函数的说明: 代码如下: CWinThread* AFXAPI AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int ...

    uint32_t格式转int格式算法

    提供了一种将uint32_t格式的数据转换为int格式数据的方法,在点云数据转换等领域具有一定的实际应用意义。

    C++类各种类型转换_数据类型的相互转换_

    描述在使用C语言进行编程时经常遇到的数据类型间的相互转换问题。

    C++MFC教程

    而32位的系统中每一运行的程序都会有一个消息队列,所以系统可以在多个消息队列中转换而不必等待当前程序完成消息处理就可以得到控制权。这种多任务系统就称为抢先式的多任务系统。Windows95/NT就是这种系统。 1.3 ...

    VC多线程编程(vs2010Unicode修改版)

    因为原实例以vc6.0为基础,在vs2010(包括vs2008等默认采用unicode编码的)中需要做一些修改,很多地方涉及到unicode的问题,需要加上_T()宏。下面几个说明只是部分修改,不是全部。 -MultiThread1中,...

    byte数组转uint

    public static uint ByteToInt(byte[] b) { uint u = 0; int startIndex = 0; if (b.Length == 8) u = (uint)(b[startIndex + 0] | b[startIndex + 1] | b[startIndex + 2] | b[startIndex + 3] | b[startIndex...

    linux多线程加锁

    linux 多线程 // vc 6.0 does not support unsigned __int64. //typedef __int64 uint64_t;

    VC多线程_断点下载_DLL

    适合需要断点 多线程下载的朋友直接使用 typedef void DownLoadCB unsigned long unsigned long ; url dir threadcount typedef void DownLoadFun char char DownLoadCB int ; void DownLoadResult unsigned long ...

    C# 调用C++ DLL的类型转换

    //C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试 //c++:HANDLE(void *) —- c#:System.IntPtr //c++:Byte(unsigned char) —- c#:System.Byte //c++:SHORT(short) —- c#...

    使用标准C++库实现的WAV音频文件读写

    200行代码实现PCM格式的WAV文件的读写,使用标准C++库实现,不依赖于其他库。 // Write WAv文件 Wave_header header(1, 48000, 16); uint32_t length = header.fmt_data-&gt;sample_per_sec * 10 * header.fmt_data...

    uint256_t:C ++无符号256位整数类型

    uint256_t C ++的无符号256位整数类型 版权所有(c)2013-2018 Jason Lee @ calccrypto在gmail.com ...所有需要在代码中完成的就是#include "uint256_t.h" # include # include " uint256_t.h " int

    md5算法的c++实现

    看到一个不错的c++实现的md5算法 class MD5 { public: typedef unsigned int size_type; // must be 32bit MD5(); MD5(const std::string& text); void update(const unsigned char *buf, size_type length); ...

    深入浅出MFC多线程

     在MFC程序中创建一个线程,宜调用AfxBeginThread函数。该函数因参数不同而具有两种重载版本,分别对应工作者线程和用户接口(UI)线程。  工作者线程 CWinThread *AfxBeginThread(  AFX_THREADPROC ...

    CreateThread创建多线程与单线程比较

    仿多线程的效果一般有2种办法:第一种是通过定时器;第二种是启动多线程,不同模式下启动函数不同,mfc与API与WIN32下面注意点也是有区别的! VC启动一个新线程的三种方法,有需要的朋友可以参考下。 第一种...

    mnist_uint8.mat下载

    手写数字集 MNIST 使用matlab处理后得到的mnist_uint8.mat数据。 数据为uint8类型的图像像素数据,包含train_x,train_y,test_x,test_y, 每项都是一行向量的方式存储的。

    Visual Uint 3.0软件测试工具

    Visual Uint 3.0软件测试工具非常好用的工具 可用自动生成测试用例 适用于VC++

    SHA512算法实现 uint32

    SHA512算法实现,使用uint32实现,适用于32位MCU,SHA512算法实现,使用uint32实现,适用于32位MCU

    前端开源库-uint64be

    前端开源库-uint64beuint64be,编码/解码大尾数无符号64位整数

Global site tag (gtag.js) - Google Analytics