先看下面一段代码
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
分享到:
相关推荐
在MFC程序中创建一个线程,宜调用AfxBeginThread函数。该函数因参数不同而具有两种重载版本,分别对应工作者线程和用户接口(UI)线程。 工作者线程 CWinThread *AfxBeginThread( AFX_THREADPROC ...
主要是多线程的互斥 文件 的查找 多线程互斥的框架 代码如下://线程函数 UINT FinderEntry(LPVOID lpParam) { //CRapidFinder通过参数传递进来 CRapidFinder* pFinder = (CRapidFinder*)lpParam; ...
在多线程编程中,最简单的方法,无非就是利用 AfxBeginThread 来创建一个工作线程,看一下这个函数的说明: 代码如下: CWinThread* AFXAPI AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int ...
提供了一种将uint32_t格式的数据转换为int格式数据的方法,在点云数据转换等领域具有一定的实际应用意义。
描述在使用C语言进行编程时经常遇到的数据类型间的相互转换问题。
而32位的系统中每一运行的程序都会有一个消息队列,所以系统可以在多个消息队列中转换而不必等待当前程序完成消息处理就可以得到控制权。这种多任务系统就称为抢先式的多任务系统。Windows95/NT就是这种系统。 1.3 ...
因为原实例以vc6.0为基础,在vs2010(包括vs2008等默认采用unicode编码的)中需要做一些修改,很多地方涉及到unicode的问题,需要加上_T()宏。下面几个说明只是部分修改,不是全部。 -MultiThread1中,...
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 多线程 // vc 6.0 does not support unsigned __int64. //typedef __int64 uint64_t;
适合需要断点 多线程下载的朋友直接使用 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++:HANDLE(void *) —- c#:System.IntPtr //c++:Byte(unsigned char) —- c#:System.Byte //c++:SHORT(short) —- c#...
200行代码实现PCM格式的WAV文件的读写,使用标准C++库实现,不依赖于其他库。 // Write WAv文件 Wave_header header(1, 48000, 16); uint32_t length = header.fmt_data->sample_per_sec * 10 * header.fmt_data...
uint256_t C ++的无符号256位整数类型 版权所有(c)2013-2018 Jason Lee @ calccrypto在gmail.com ...所有需要在代码中完成的就是#include "uint256_t.h" # include # include " uint256_t.h " int
看到一个不错的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程序中创建一个线程,宜调用AfxBeginThread函数。该函数因参数不同而具有两种重载版本,分别对应工作者线程和用户接口(UI)线程。 工作者线程 CWinThread *AfxBeginThread( AFX_THREADPROC ...
仿多线程的效果一般有2种办法:第一种是通过定时器;第二种是启动多线程,不同模式下启动函数不同,mfc与API与WIN32下面注意点也是有区别的! VC启动一个新线程的三种方法,有需要的朋友可以参考下。 第一种...
手写数字集 MNIST 使用matlab处理后得到的mnist_uint8.mat数据。 数据为uint8类型的图像像素数据,包含train_x,train_y,test_x,test_y, 每项都是一行向量的方式存储的。
Visual Uint 3.0软件测试工具非常好用的工具 可用自动生成测试用例 适用于VC++
SHA512算法实现,使用uint32实现,适用于32位MCU,SHA512算法实现,使用uint32实现,适用于32位MCU
前端开源库-uint64beuint64be,编码/解码大尾数无符号64位整数