多线程编程

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

以上是关于多线程编程的主要内容,如果未能解决你的问题,请参考以下文章

python中的多线程和多进程编程

什么是Java多线程编程?

多线程 Thread 线程同步 synchronized

C++11多线程 原子操作概念及范例

多线程是啥

多个用户访问同一段代码