多线程编程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程编程相关的知识,希望对你有一定的参考价值。
转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992340.html
最近想将ucos移植到VC2010上运行,这就碰到了现在的第一个问题:VC上怎么进行线程间的切换。毕业之后基本没有碰过pc机上的编程,这也导致对VC的多线程编程的API一点多不熟悉。花了很长时间在baidu上搜索资料,终于有了一些收获,不是不想在google上搜索资料,但是最近不知道为什么google老是上不去。现在将这些搜索到的资料进行总结。
多线程的API:
(1) HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId); 该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄。
(2)DWORD SuspendThread(HANDLE hThread);
该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。
(3)DWORD ResumeThread(HANDLE hThread);
该函数用于结束线程的挂起状态,执行线程。
(4)VOID ExitThread(DWORD dwExitCode);
该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。其中参数dwExitCode用来设置线程的退出码。
(5)BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode); 一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用TerminateThread强行终止某一线程的执行。 使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。 (6)BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam); 该函数将一条消息放入到指定线程的消息队列中,并且不等到消息被该线程处理时便返回。 调用该函数时,如果即将接收消息的线程没有创建消息循环,则该函数执行失败。
(7)BOOL DuplicateHandle(HANDLE hSourceProcessHandle,
HANDLE hSourceHandle,
HANDLE hTargetProcessHandle,
LPHANDLE lpTargetHandle,
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwOptions);
这个API看说明以及一些解释之后,还是有些迷迷糊糊的,可能脑子不太灵光。后来通过程序终于导致搞清楚些,这就不多说了,还是看例子吧,以免误导。
#include <windows.h>
#include <stdio.h>
const UINT uiTimerID = 10;
HANDLE mainhandle;
int msg_count = 0;
HANDLE hd_send_thread;
HANDLE hd_recv_thread;
void send_thread_func()
{
while(1)
{
msg_count++;
printf("msg_count: %d\\n", msg_count);
Sleep(1000);
if(msg_count > 5)
{
DuplicateHandle(GetCurrentProcess(),
hd_recv_thread,
GetCurrentProcess(),
&mainhandle,
0,
TRUE,
2);
ResumeThread(mainhandle);
SuspendThread(GetCurrentThread());
}
}
}
void recv_thread_func()
{
static int recv_msg_count = 0;
while(1)
{
if(recv_msg_count < msg_count)
{
printf("recv_msg_count: %d\\n", recv_msg_count++);
Sleep(1000);
}
else
{
exit(0);
}
}
}
VOID CALLBACK TimerFun(HWND hwnd, UINT a, UINT b, DWORD c)
{
static int nCount = 0;
printf("Timer Function, nCount = %d..........................\\n", nCount++);
if(nCount > 5)
{
DuplicateHandle(GetCurrentProcess(),
hd_send_thread,
GetCurrentProcess(),
&mainhandle,
0,
TRUE,
2);
ResumeThread(mainhandle);
SuspendThread(GetCurrentThread());
}
}
int main()
{
MSG msg;
SetTimer(NULL, uiTimerID, 1000, TimerFun);
hd_send_thread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)send_thread_func,
0,
0,
0);
SuspendThread(hd_send_thread);
hd_recv_thread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)recv_thread_func,
0,
0,
0);
SuspendThread(hd_recv_thread);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
程序的流程为:创建一个1s中的定时器,一个hd_send_thread线程,一个hd_recv_thread线程,
其中hd_send_thread和hd_recv_thread线程创建之后就将其挂起。
定时器中断5次之后,将hd_send_thread线程唤醒,将其自己挂起,
hd_send_thread运行到msg_count>5时,将其自己挂起,唤醒hd_recv_thread线程,
hd_recv_thread运行到recv_msg_count>5时,退出程序。
转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992340.html
以上是关于多线程编程的主要内容,如果未能解决你的问题,请参考以下文章