C++中多线程



1.多线程

多线程案例:

#include
<iostream>

#include
<thread>

#include
<string>

#include<windows.h>

using
namespace
std;

void
run(int
num)

{

Sleep(1000);

std::cout
<< "你好天朝"
<< num <<
endl;

}

void
main()

{

thread *p[10];

for (int
i = 0;
i < 10;i++)

{

p[i]
= new
thread(run,i);//循环创建线程

//p[i]->join();//等待,相当于堵塞的状态

p[i]->detach();//脱离当前主线程自由执行,乱序,也就是说每个线程的执行是随机的,是并发执行。

}

cin.get();

}

运行结果是:

2.线程案例2

#include
<iostream>

#include
<thread>

#include
<string>

#include<windows.h>

using
namespace
std;

void
helloworld()

{

std::cout
<< "你好天朝"
<< endl;

}

void
helloworldA()

{

std::cout
<< "你好天朝A"
<< endl;

}

void
helloworldB()

{

std::cout
<< "你好天朝B"
<< endl;

}

//通过下面这种方式实现的线程永远是顺序的

void
main()

{

std::thread
t1(helloworld);//线程顺序执行

std::thread
t2(helloworldA);

std::thread
t3(helloworldB);

cin.get();

}

3.线程加锁和线程解锁

#include
<iostream>

#include
<thread>

#include
<string>

#include<windows.h>

#include<mutex>

using
namespace
std;

//两个线程并行访问一个变量

int
g_num = 20;//找到或者找不到的标识

mutex
g_mutex;

void
goA(int
num)

{

//你访问的变量,在你访问期间,别人访问不了,

//这种情况明显可以看到自己被执行的次数多了

g_mutex.lock();

for (int
i = 0;
i < 15;
i++)

{

Sleep(300);

g_num = 10;

std::cout
<< "线程"
<< num <<
"  
" <<
g_num <<
endl;

}

g_mutex.unlock();

}

void
goB(int
num)

{

for (int
i = 0;
i < 15;
i++)

{

Sleep(500);

g_num = 11;

std::cout
<< "线程"
<< num <<
"  
" <<
g_num <<
endl;

}

}

void
main()

{

thread
t1(goA,1);

thread
t2(goB,
2);

t1.join();

t2.join();

std::cin.get();

}

运行结果:

4.线程之间通信以及锁定

案例:

#include
<iostream>

#include
<thread>

#include
<string>

#include<windows.h>

using
namespace
std;

//两个线程并行访问一个变量

//找到或者找不到的标识

int
g_num = 20;

void
goA(int
num)

{

for (int
i = 0;
i < 15;i++)

{

Sleep(1000);

if (i
== 6)

{

g_num = 5;

}

if (g_num
== 5)

{

std::cout
<< "线程"
<< num <<
"结束\n";

return;

}

std::cout
<< "线程"
<< num <<

" <<
g_num <<
endl;

}

}

void
goB(int
num)

{

for (int
i = 0;
i < 150;
i++)

{

Sleep(1000);

if (g_num
== 5)

{

std::cout
<< "线程"
<< num <<
"结束  
\n";

return;

}

std::cout
<< "线程"
<< num <<
"  
" <<
g_num <<
endl;

}

}

void
main()

{

thread
t1(goA,
1);

thread
t2(goB,
2);

t1.join();

t2.join();

std::cin.get();

}

时间: 2024-08-10 14:16:49

C++中多线程的相关文章

Python有了asyncio和aiohttp在爬虫这类型IO任务中多线程/多进程还有存在的必要吗?

最近正在学习Python中的异步编程,看了一些博客后做了一些小测验:对比asyncio+aiohttp的爬虫和asyncio+aiohttp+concurrent.futures(线程池/进程池)在效率中的差异,注释:在爬虫中我几乎没有使用任何计算性任务,为了探测异步的性能,全部都只是做了网络IO请求,就是说aiohttp把网页get完就程序就done了. 结果发现前者的效率比后者还要高.我询问了另外一位博主,(提供代码的博主没回我信息),他说使用concurrent.futures的话因为我全

Android中多线程编程(四)AsyncTask类的详细解释(附源码)

Android中多线程编程中AsyncTask类的详细解释 1.Android单线程模型 2.耗时操作放在非主线程中执行 Android主线程和子线程之间的通信封装类:AsyncTask类 1.子线程中更新UI 2.封装.简化异步操作. 3.AsyncTask机制:底层是通过线程池来工作的,当一个线程没有执行完毕,后边的线程是无法执行的.必须等前边的线程执行完毕后,后边的线程才能执行. AsyncTask类使用注意事项: 1.在UI线程中创建AsyncTask的实例 2.必须在UI线程中调用As

Delphi中多线程用消息实现VCL数据同步显示

Delphi中多线程用消息实现VCL数据同步显示 Lanno Ckeeke 2006-5-12 概述: delphi中严格区分主线程和子主线程,主线程负责GUI的更新,子线程负责数据运算,当数据运行完毕后,子线程可以向主线程式发送消息,以便通知其将VCL中的数据更新. 实现: 关键在于消息的发送及接收.在消息结构Tmessage中wParam和lParam类型为Longint,而指针类型也定义为Longint,可以通过此指针来传递自己所感兴趣的数据.如传递字符数组: 数组定义: const MA

iOS中多线程基本概念

进程与线程 什么是进程? 近程是指在系统中正在运行的一个应用程序. 每个近程之间是独立的,每个近程均运行在其专用且受保护的内存空间内. **可以通过“活动监视器”可以查看Mac系统中所有开启的进程. 什么是线程? 一个进程要想执行任务,必须得有线程(每一个进程至少要有一条线程). 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行. 线程的串行 一个线程中任务的执行是串行(顺序执行的) 如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务. 也就是说,在同一时间内

java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)

import java.util.concurrent.locks.*; class DuckMsg{ int size;//烤鸭的大小 String id;//烤鸭的厂家和标号 DuckMsg(){ } DuckMsg(int size, String id){ this.size=size; this.id=id; } public String toString(){ return id + " 大小为:" + size; } } class Duck{ private int

iOS中多线程的实现方案

我去, 好蛋疼, 刚刚写好的博客就因为手贱在触控板上右划了一下, 写的全丢了, 还得重新写, 博客园就没有针对这种情况的解决方案吗?都不想写了 一. iOS中多线程的实现方案有四种 (1) NSThread陷阱非常多, 有缺陷, 不过是OC的, 偶尔用一下 (2) GCD在苹果在iOS4推出的, 能充分利用设备的多核, 而且不用考虑线程, 性能比NSThread好的多 GCD研究起来就比较深了, 所以在面试的时候会经常被问到 (3) NSOperation封装了很多使用的使用的功能, 某些情况下

iOS中多线程原理与runloop介绍

http://mobile.51cto.com/iphone-403490.htm iOS中多线程原理与runloop介绍 iPhone中的线程应用并不是无节制的,官方给出的资料显示iPhone OS下的主线程的堆栈大小是1M,第二个线程开始都是512KB.并且该值不能通过编译器开关或线程API函数来更改.只有主线程有直接修改UI的能力.……>>详细 兄弟专题:iOS人机交互指南之UI设计基础 1 iOS多线程编程知多少 在iOS的世界里有两种实现多线程的方式: 多线程是一个比较轻量级的方法来

java中多线程的实例代码

今天开始学习java中的多线程,在看书的过程中写了一个实例来练习多线程的用法,下面把代码放到博文里,里面很多的注释,可以帮助理解.     运行结果如下: main:启动MessageLoop线程...main:等待MessageLoop线程结束...main:继续等待.main:继续等待.main:继续等待.main:继续等待.Thread-0:消息1main:继续等待.main:继续等待.main:继续等待.main:继续等待.Thread-0:消息2main:继续等待.main:继续等待.

OC中多线程的一些概念

1.进程1.1>进程是指在系统中正在运行的一个应用程序(同时打开QQ和Xcode,系统会分别启动2个进程)1.2>每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存空间内 2.线程1.1>一个进程想要执行任务,必须得有线程(每个进程至少要有一条线程,即主线程)1.2>线程是进程的基本执行单元,进程的所有任务都在线程中执行3.多线程3.1>一个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务      进程→车间, 线程→车间工人3.2>多线程技术

python中多线程调度机制以及GIL

总结下python中线程调度机制. 对于线程调度机制而言,同操作系统的进程调度一样,最关键是要解决两个问题: 1.在何时选择挂起当前线程,并选择处于等待的先一个线程呢? 2.在众多等待的线程中,选择哪一个作为激活线程呢? 在python多线程机制中,这个两个问题是有两个层次解决的. 如,进程间的切换,当发生了时钟中断,操作系统响应时钟中断,并在这个时候开始进程的调度. 同样的,python也是通过软件模拟了这样的时钟中断,来激激活线程的调度. 我们知道,python字节码解释器是按照指令,顺序一