码迷,mamicode.com
首页 > 编程语言 > 详细

C++拾遗--多线程:多线程的引入

时间:2015-02-26 18:37:15      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:多线程   c语言   异步   内核   线程   

                         C++拾遗--多线程:多线程的引入

前言

    多线程是编程中的一个重要内容。多核时代使多线程称为一种可能,显然,一件事情多个人干,效率一定会提升。下面来看下C语言中是如何使用多线程的。

正文

先来看一个实例

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <Windows.h>

DWORD WINAPI run(void *p)
{
	char *mess = (char*)p;
	printf("线程%d,弹窗\n", GetCurrentThreadId());
	char threadId[20];
	sprintf(threadId, "线程%d", GetCurrentThreadId());
	MessageBoxA(0, mess, threadId, 0);
	return 0;
}
int main(void)
{
	printf("******C语言多线程演示***by David***\n");
	char *mess[] = { "123", "456", "789" };
	HANDLE handles[3];
	for (int i = 0; i < sizeof(mess) / sizeof(*mess); i++)
	{
		handles[i] = CreateThread(NULL, 0, run, mess[i], 0, NULL);
	}
	WaitForMultipleObjects(3, handles, 1, INFINITE);
	return 0;
}
运行

技术分享


异步弹出了三个窗口,并打印了各自的线程号。若是有没看懂的地方,下面有详细解释:

1.handle是句柄,在windows中用句柄来标识对象。本质很简单 typedef void * HANDLE;

2.CreateThread()用来创建线程。原型

HANDLE WINAPI CreateThread(
    LPSECURITY_ATTRIBUTES lpThreadAttributes,    //内核对象的安全属性
    SIZE_T dwStackSize,                          //线程栈大小
    LPTHREAD_START_ROUTINE lpStartAddress,       //线程函数地址
    LPVOID lpParameter,                          //传给线程函数的参数
    DWORD dwCreationFlags,                       //控制位
    LPDWORD lpThreadId                           //获取线程id
    );

参数解释:

第一个参数是线程内核对象的安全属性,一般传入NULL表示使用默认设置。

第二个参数是线程栈空间的大小。传入0表示使用默认大小(1MB)

第三个参数是新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。

第四个参数是传给线程函数的参数。typedef void * LPVOID

第五个参数是用来控制线程的创建,0表示创建后立即执行。

第六个参数是传出参数,用来获得线程的id。显然,传入NULL,表示调用者并不想知道线程的id。

3.线程函数的声明。#define WINAPI __stdcall  (vs2013)typedef unsigned long DWORD。其中,__stdcall是指C/CPP中函数的调用方式。主要有两点:1.实参从右向左入栈。2.调用者负责清空参数栈。

4.线程等待函数

DWORD
WINAPI
WaitForMultipleObjects(
    DWORD nCount,             //内核对象的个数
    CONST HANDLE *lpHandles,  //句柄数组的地址
    BOOL bWaitAll,            //是否等待所有
    DWORD dwMilliseconds      //等待的最大时间,单位毫秒,INFINITE表示无限等待
    );

函数功能:让线程进入等待转态,直到条件触发。内核对象在运行期间处于未触发的状态,直到执行结束。


总结:

使用多线程,就要先写好线程函数,然后调用相关函数创建线程即可。





本专栏目录

所有内容的目录



C++拾遗--多线程:多线程的引入

标签:多线程   c语言   异步   内核   线程   

原文地址:http://blog.csdn.net/zhangxiangdavaid/article/details/43700485

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!