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表示无限等待

);

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

总结:

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

本专栏目录

所有内容的目录

时间: 2024-10-13 08:07:54

C++拾遗--多线程:多线程的引入的相关文章

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

C++拾遗--C++多线程引入 前言 C++库文件也提供了对多线程的支持,主要包含头文件thread即可使用C++中的多线程.它的一些与多线程有关的方法和C语言不同.我们有必要来探讨下C++编程下如何使用多线程. 正文 1.示例 与C语言多线程引入相同,我们先看一个C++多线程的示例. #include <iostream> #include <thread> //C++中的多线程头文件 #include <Windows.h> using namespace std;

IOS开发多线程-多线程技术1

一.基本概念 1.什么是进程 进程就是指在系统中正在运行的一个应用程序 每个应用之间是相互独立的 每个进程都运行在其专有的并且受保护的内存空间内. 2.什么是线程 一个进程想要执行程序,就必须需要一个线程, 线程是程序执行的基本单元,应用的所有的任务都在线程中执行的. 当程序启动之后,系统会自动为进程创建一条线程,称之为 “主线程”  “UI线程” 3.线程的串行 一个线程执行任务是串行的,也就是说,在一个线程内,执行任务是从顺序执行的 同一时间,线程只能执行一个任务----> CPU在同一时间

Java基础-多线程-③多线程的同步之synchronized

使用线程同步解决多线程安全问题 上一篇 Java基础-多线程-②多线程的安全问题 中我们说到多线程可能引发的安全问题,原因在于多个线程共享了数据,且一个线程在操作(多为写操作)数据的过程中,另一个线程也对数据进行了操作,从而导致数据出错.由此我们想到一个解决的思路:将操作共享数据的代码行作为一个整体,同一时间只允许一个线程执行,执行过程中其他线程不能参与执行.线程同步就是用来实现这样的机制. synchronized代码块 Java中提供了synchronized关键字,将可能引发安全问题的代码

Java基础-多线程-②多线程的安全问题

什么是线程的安全问题? 上一篇 Java基础-多线程-①线程的创建和启动 我们说使用实现Runnable接口的方式来创建线程,可以实现多个线程共享资源: 1 class Dog implements Runnable { 2 // 定义线程共享数据 3 private int t = 100; 4 5 @Override 6 public void run() { 7 // TODO:死循环,暂不处理 8 while (true) { 9 if (t > 0) { 10 11 System.ou

Java多线程——多线程的基本概念和使用

一.进程和线程的基础知识 1.进程和线程的概念 进程:运行中的应用程序称为进程,拥有系统资源(cpu.内存) 线程:进程中的一段代码,一个进程中可以有多段代码.本身不拥有资源(共享所在进程的资源) 在java中,程序入口被自动创建为主线程,在主线程中可以创建多个子线程. 区别: 1.是否占有资源问题 2.创建或撤销一个进程所需要的开销比创建或撤销一个线程所需要的开销大. 3.进程为重量级组件,线程为轻量级组件 多进程: 在操作系统中能同时运行多个任务(程序) 多线程: 在同一应用程序中有多个功能

一:多线程--多线程简单介绍

一.进程和线程 1.什么是进程:进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 二.多线程 1.什么是多线程:1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务 2.多线程的原理 同一时间,CPU只能处理1条线程,只有1条线程在工作(执行) 多线程并发(同时)执行,其实是CP

C#中的多线程 - 多线程的使用 z

原文:http://www.albahari.com/threading/part3.aspx 专题:C#中的多线程 1基于事件的异步模式Permalink 基于事件的异步模式(event-based asynchronous pattern,EAP)提供了一种简单的方式,让类可以提供多线程的能力,而不需要使用者显式启动和管理线程.它也提供如下的功能: 协作取消模型(cooperative cancellation model) 工作线程完成时安全更新 WPF 或 Windows Forms 控

多线程/多线程编程范式/模型

多线程专栏:http://blog.csdn.net/column/details/killthreadseries.html leader/followers多线程网络模型:http://blog.csdn.net/goldlevi/article/details/7705180以及博客相关内容 tornado简明教程:http://demo.pythoner.com/itt2zh/index.html 里面有关于服务器的设计思想 条件变量:http://blog.csdn.net/hiflo

我的多线程-多线程必知的N个常识

多线程的基础知识有哪些? 一根线:正在执行的程序主体只有一个 多线程实例:GUI应用程序(查找和执行操作并行),耗时间的io操作,多个客户端一个服务器, 什么是  顺序.并行.并发.   什么是并发顺序.什么是并发并行? 程序何时终止? 睡着的线程如何被唤醒? 什么是线程的互斥?什么是线程的锁机制? 当前线程如何知道自己是否获取某一个对象的锁? 什么是等待队列? 什么是等待唤醒机制? 线程状态是如何迁移的? wait方法使用的条件是什么? 多线程的评估标准有哪些? 什么是线程兼容?如何将非线程安

java多线程,多线程加锁以及Condition类的使用

看了网上非常多的运行代码,很多都是重复的再说一件事,可能对于java老鸟来说,理解java的多线程是非常容易的事情,但是对于我这样的菜鸟来说,这个实在有点难,可能是我太菜了,网上重复的陈述对于我理解这个问题一点帮助都没有.所以这里我写下我对于这个问题的理解,目的是为了防止我忘记. 还是从代码实例开始讲起: import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.co