c++多线程实例
#include <windows.h>
#include <stdio.h>
#include <process.h> int g_ntotal = ;
int g_thread_counter;
int g_sum;//计算结果
HANDLE g_thread_lock;//HANDLE 被类型定义为 void * struct THREAD_DATA
{
int num_threads;
int thread_id;
}; void sum_func(void *pdata)
{
THREAD_DATA *ptdata = (THREAD_DATA *)pdata; int i, sum = ;
for (i = ptdata->thread_id; i <= g_ntotal; i += ptdata->num_threads)
sum += i; delete ptdata; WaitForSingleObject(g_thread_lock, INFINITE);
g_sum += sum;
--g_thread_counter;
ReleaseMutex(g_thread_lock);
} void main(void)
{
LARGE_INTEGER hfreq, hcounter1, hcounter2;//这三个货是64位的整数
QueryPerformanceFrequency(&hfreq);
//printf("%ld",hfreq);
SYSTEM_INFO sys_info;//这货是结构体变量
GetSystemInfo(&sys_info);//实参为指向结构体的指针
int num_processors = sys_info.dwNumberOfProcessors;//值为2,是一个DWORD类型的成员变量,DWORD被定义为无符号长整型
//num_processors = 1; printf("Number of processors=%d\n", num_processors);//机器支持的线程数目 g_thread_lock = CreateMutex(NULL, FALSE, NULL);//返回值为无类型指针,CreateMutex作用是找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。 g_thread_counter = num_processors;//系统支持的线程数
g_sum = ;//计算结果初始化 QueryPerformanceCounter(&hcounter1);//获取当前时间保存到 hcounter1 中,实参是指向64位整数的指针 int i;
THREAD_DATA *pdata;//THREAD_DATA是本程序中自己定义的结构体
for (i = ; i < num_processors; ++i)
{
pdata = new THREAD_DATA;
pdata->thread_id = i + ;
pdata->num_threads = num_processors;//值为2
_beginthread(sum_func, , pdata);
} pdata = new THREAD_DATA;
pdata->thread_id = ;
pdata->num_threads = num_processors;//值为2
sum_func(pdata); while ()
{
int itemp;
WaitForSingleObject(g_thread_lock, INFINITE);
itemp = g_thread_counter;//系统支持的线程数,值为2
ReleaseMutex(g_thread_lock);
if (itemp == ) break;
} QueryPerformanceCounter(&hcounter2);//获取结束时间,保存到 hcounter2 中 double dt = (double)(hcounter2.QuadPart - hcounter1.QuadPart)
/ (double)hfreq.QuadPart;//表达式中涉及的三个变量是共用体类型(8字节),其中QuadPart是共用体的 long long类型成员,在此处被毫无节操地转换成了double类型,double也是占用8字节 printf("sum=%d\n", g_sum);
printf("Calculation time=%f\n", dt);//此处将%g改为了%f,这里是代码的运行时间
//printf("%d", sizeof(double));
getchar(); CloseHandle(g_thread_lock); //将CreateMutex创建的互斥体关闭
}
c++多线程实例的更多相关文章
- Linux多线程实例练习 - pthread_cancel()
Linux多线程实例练习 - pthread_cancel 1.代码 xx_pthread_cancel.c #include <pthread.h> #include <stdio ...
- Linux多线程实例练习 - pthread_exit() 与 pthread_join()
Linux多线程实例练习 - pthread_exit 与 pthread_join pthread_exit():终止当前线程 void pthread_exit(void* retval); pt ...
- Linux多线程实例练习 - pthread_create()
Linux多线程实例练习 pthread_create():创建一个线程 int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, ...
- Java多线程-实例解析
Java多线程实例 3种实现方法Java中的多线程有三种实现方式:1.继承Thread类,重写run方法.Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯 ...
- Java Tread多线程(0)一个简单的多线程实例
作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多 ...
- 【原创】Kafka Consumer多线程实例续篇
在上一篇<Kafka Consumer多线程实例>中我们讨论了KafkaConsumer多线程的两种写法:多KafkaConsumer多线程以及单KafkaConsumer多线程.在第二种 ...
- JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口
JAVA之旅(十二)--Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口 开始挑战一些难度了,线程和I/O方面的操作了,继续坚持 一. ...
- Qt5.9一个简单的多线程实例(类QThread)(第一种方法)
Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...
- Python 多线程 实例
多线程实例 import threading import time def eat(): eatTime = time.time() for i in range(30): print('count ...
- 【原创】Kafka Consumer多线程实例
Kafka 0.9版本开始推出了Java版本的consumer,优化了coordinator的设计以及摆脱了对zookeeper的依赖.社区最近也在探讨正式用这套consumer API替换Scala ...
随机推荐
- 题目1099:后缀子串排序(qsort函数自定义cmp函数)
题目链接:http://ac.jobdu.com/problem.php?pid=1099 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- [转]stetho使用介绍
原文链接:http://www.jianshu.com/p/c03a8959d1a5# 转载请注明来源,尊重作者成果 介绍 stetho是facebook开发的Android调试工具.它可以通过chr ...
- fs-extra 文件管理
一.fs-extra 文件管理 $npm install fs-extra --save 1.创建一个目录 fs.mkdir(path, [mode], [callback(err)]) path 将 ...
- Python安装模块出错(No module named setuptools)解决方法
Python第三方模块中一般会自带setup.py文件,在Windows环境下,我们只需要在命令行中使用以下命令即可自动化安装 python setup.py install 安装的过程中有可能会出现 ...
- Docker Swarm——集群管理
前言 之前在总结docker machine的时候,当时对docker理解还不够深入,甚至还不知道 docker machine 与 docker swarm 的区别. 在查阅资料以及官方文档之后,今 ...
- 高斯混合模型Gaussian Mixture Model (GMM)
混合高斯模型GMM是指对样本的概率密度分布进行估计,而估计采用的模型(训练模型)是几个高斯模型的加权和(具体是几个要在模型训练前建立好).每个高斯模型就代表了一个类(一个Cluster).对样本中的数 ...
- java 中的this
this 关键字 1.在类的方法定义中使用this关键字 代表使用该方法的对象的引用 2.必须指出当前使用方法的对象是谁时 使用this 3.有时使用this可以处理方法中成员变量和参数重名的情况 4 ...
- ubuntu16.04下安装文献管理工具mendelay
1.首先下载mendelay的安装包 到官网下载对应版本的安装包,官网地址:Download for Ubuntu and Kubuntu 16.04 LTS, 17.04 and Debian 2. ...
- hihocoder 1829 - 压缩字符串 - [状压+暴力枚举][2018ICPC北京网络预赛B题]
题目链接:https://hihocoder.com/problemset/problem/1829 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Lara Croft, ...
- JavaScript学习12.1
JavaScript弹窗可以创建3种消息框:警告框.确认框.提示框,可以不带window对象直接使用相应的方法警告框:保护用户可以得到某些信息,当出现警告框后需要用户点击确认按钮之后才能操作windo ...