Win32多线程程序设计

Win32多线程程序设计

”多线程多任务“是程序开发者和用户都需要的一个重要资产。从WindowsNT开始,完全支持32位程序的抢占式多任务。带领我们进入了”多线程多任务“时代。

基本概念

进程(processes)

从win32角度来看,进程含有内存和资源,被进程拥有的内存理论上可达2GB,资源包括内核对象(handle,mutex…),user资源(对话框,字符串…),GDI资源(cdc和brush…)。

内存(memory)

每个进程存储数据的地方,分为:

  • Code | 存储程序代码
  • Data | 存储 全局变量,静态变量
  • Stack | 存储函数调用,线程分配的堆栈空间

线程(thread)

执行任务的载体

为什么程序不用多进程?

多线程:

  1. 线程廉价;
  2. 线程启动,退出快;
  3. 线程对系统资源冲击小;
  4. .线程对大部分内核对象有拥有权;

多进程:

  1. 耗费系统
  2. 程序窗口不易共享句柄

Win32线程创建

不使用C Run-time Library的多线程示例

#include <windows.h>
#include <tchar.h>
#include <Strsafe.h>

#define MAX_THREADS 5//线程数
#define BUF_SIZE 1024

DWORD WINAPI ThreadFun(LPVOID lpParam)
{
    TCHAR msgBuf[BUF_SIZE];
    size_t msgLen;
    DWORD dwChars;

    //线程参数取得
    int n = *(int*)lpParam;

    //输出到stdout
    HANDLE hStdOut = ::GetStdHandle(STD_OUTPUT_HANDLE);
    ::StringCchPrintf(msgBuf, BUF_SIZE, TEXT("%d%d%d%d%d%d%d%d%d%d\n"),
        n, n, n, n, n, n, n, n, n, n);
    ::StringCchLength(msgBuf, BUF_SIZE, &msgLen);

    for (int i = 0; i < 5; i++)
    {
        ::WriteConsole(hStdOut, msgBuf, msgLen, &dwChars, NULL);
    }
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hThread[MAX_THREADS];
    DWORD dwThreadId;
    //线程创建
    for (int i = 0; i < MAX_THREADS; i++)
    {
        hThread[i] = (HANDLE)::CreateThread(
            NULL,
            0,
            ThreadFun,
            &i,
            0,
            &dwThreadId);
        if (hThread[i] != NULL)
        {
            printf("Thread launched %d\n", i);
        }
    }
    //等待所有线程结束
    ::WaitForMultipleObjects(MAX_THREADS, hThread, TRUE, INFINITE);

    //关闭结束线程句柄
    for (int i = 0; i < MAX_THREADS; i++)
    {
        ::CloseHandle(hThread[i]);
    }

    return 0;
}

使用C Run-time Library的多线程示例

#include <stdio.h>
#include <Windows.h>
#include <process.h>
//线程数
#define MAX_THREADS 5

unsigned int WINAPI ThreadFun(LPVOID lpParam)
{
    int n = *(int*)lpParam;
    for (int i = 0; i < 5; i++)
    {
        printf("%d%d%d%d%d%d%d%d%d%d\n", n, n, n, n, n, n, n, n, n, n);
    }
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hThread[MAX_THREADS];
    unsigned int dwThreadId;
    //线程创建
    for (int i = 0; i < MAX_THREADS; i++)
    {
        hThread[i] = (HANDLE)::_beginthreadex(
            NULL,
            0,
            ThreadFun,
            &i,
            0,
            &dwThreadId);
        if (hThread[i] != NULL)
        {
            printf("Thread launched %d\n", i);
        }
    }
    //等待所有线程结束
    ::WaitForMultipleObjects(MAX_THREADS, hThread, TRUE, INFINITE);

    //关闭结束线程句柄
    for (int  i = 0; i < MAX_THREADS; i++)
    {
        ::CloseHandle(hThread[i]);
    }

    return 0;
}

区别使用C Run-time Library:

以上使用C Run-time Library和未使用C Run-time Library并非很严格,因为程序的startup就是从C Run-time Library开始执行,所以严格不使用C Run-time Library是不存在。那么只要满足下面情况,我们就认为是使用了C Run-time Library

  1. 在C程序中使用了malloc()和free(),或者在C++中使用了new和delete。
  2. 调用了stdio.h或者io.h中声明的任何函数,包括fopen open getchar write read。
  3. 使用浮点变量或者浮点运算函数
  4. 调用任何一个使用静态缓冲区的runtime函数,如asctime(),strtok(),rand();

如何正确函数创建Win32线程?

未使用C Run-time Library,利用CreateThread()函数创建线程,使用了C Run-time Library,利用_beginthreadex()函数创建线程,MFC程序中使用CWinThread创建线程。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-21 20:25:45

Win32多线程程序设计的相关文章

由《win32多线程程序设计》临界区的问题所想

之前看侯捷翻译的<win32多线程程序设计>中关于线程同步中的临界区问题,其中举得例子是对链表的操作.死锁的问题是对一个Swaplist函数的问题,现列举代码如下: void SwapLists(List *list, List *list2){ List *tmp_list; EnterCriticalSection(list1->critical_sec); EnterCriticalSection(list2->critical_sec); tmp->list = li

Win32多线程程序设计读书笔记

为什么多线程? 多线程并不一定是最好的,合适才是最好的. 多线程主要的优点是价廉物美,启动快.退出快.与其他线程共享核心对象,很容易实现共产主义的伟大梦想.但是其又有不可预期.测试困难的缺点. 使用好多线程,就是要知道何时应该用多线程,何时不该用.如果应该用多线程,如何解决Race Condition问题?如何共享数据?如何提高效率?如何同步线程和数据?总结起来就是: 有始有终,线程的创建和释放都要靠自己 不抛弃不放弃,等一等线程,让它做完自己的工作 文明有序,资源占用无冲突 但是有时候却不建议

Event会丢失的情况出自&lt;&lt;win32多线程程序设计&gt;&gt;

win32多线程设计总结

近期拜读了win32多线程程序设计,总结了这么几点 多线程的主要问题在于线程同步,而线程调用由操作系统实现,因此实现线程同步必须有操作系统提供支持,书中提到过以前我所用过的busy loop与sleep结构来实现线程同步,当时我的感觉就是没有其他办法了,直到遇上了wait系列API,下面就来总结一下各种线程同步方法 1.临界区的使用,优点不需要产生系统内核对象,速度快,效率高.关键API: void InitializeCriticalSection(LPCRITICAL_SECTION lpC

win32多线程编程

关于多线程多进程的学习,有没有好的书籍我接触的书里头关于多线程多进程部分,一是<操作系统原理>里面讲的相关概念   一个是<linux基础教程>里面讲的很简单的多线程多进程编程,再就是<VC开发>里头讲一点总觉得自己学的不透彻,多线程多进程这部分没啥信心    <win32多线程程序设计>华中科技大学出版社2001-1版本

深入浅出MFC——MFC多线程程序设计(七)

1. 从操作系统层面看线程——三个观念:模块(MDB).进程(PDB).线程(TDB) 2. “执行事实”发生在线程身上,而不在进程身上.也就是说,CPU调度单位是线程而非进程.调度器据以排序的,是每个线程的优先级. 3. MDB.PDB和TDB: 注:Thread Context:线程环境,也即构成线程的“后台”. 4. 从程序设计层面看线程——Worker Threads 和 UI Threads: 5. MFC多线程程序设计——探索CWinThread. 6. Worker Thread:

win32多线程(三) 死锁

任何时候当一段代码需要两个(或更多)资源时,都有潜在性的死锁. void SwapLists(List *list1, List *list2) { List *tmp_list; EnterCriticalSection(list1->m_section); EnterCriticalSection(list2->m_section); tmp->list = list1->head; list1->head = list2->head; list2->head

POSIX多线程程序设计_流水线工作例程

#include<pthread.h> #include "errors.h" typedef struct stage_tag{<span style="white-space:pre"> </span>//流水线的工作单元结构体 pthread_mutex_t mutex;<span style="white-space:pre"> </span>//保护当前工作单元数据的互斥锁 p

win32多线程 (一) 线程创建与结束等待

#include "stdafx.h"#include <Windows.h>#include <iostream> using namespace std; DWORD WINAPI ThreadFuncFirst(LPVOID param){ int iCount = 50; while(iCount--){  cout<<"\nThreadFuncFirst:"<<iCount; } return 0;} DWO