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 ...
随机推荐
- 第二步 使用Cordova 3.0(及以上版本) 创建安卓项目(2014-6-25)
参考资料: http://www.cnblogs.com/numtech/p/3233469.html http://blog.sina.com.cn/s/blog_9e245c690101jurr. ...
- Java虚拟机九 java.lang.String在虚拟机中的实现
在Java中,Java的设计者对String对象进行了大量的优化,主要有三个特点: 1.不变性: 不变性是指String对象一旦生成,则不能再对它进行改变.String的这个特点可以泛化成不变(imm ...
- java.lang.NoClassDefFoundError: org/jdom/input/SAXBuilder
java.lang.NoClassDefFoundError: org/jdom/input/SAXBuilder 少导入了jdom.jar包. 下载地址:http://www.jdom.org/do ...
- baidu.com直接访问网站,不跳转www.baidu.com
平常最多的需求是将baidu.com指向全域名www.badu.com,但是往往需求是各种各样,这两天就遇到一个反向需求.将baidu.com直接访问网站,而不做跳转. 最近两天在给域名证书续费,但是 ...
- java中List的toArray方法
把List转换成某种类型的数组,就拿String类型来做例子吧,有以下两种方式: //方法1,使用不带参数的toArray方法 String[] arr1=new String[list.size() ...
- Docker 学习应用篇三:使用docker搭建的环境,安装thinksns
Thinksns 是一个开源的社交网站,因为目前的项目需要用到这个,所以就下载一个安装试试看. 之前在windows上用了wamp,安装的很顺利.但是项目是要部署到linux上的.于是我便用了Dock ...
- HOJ-1005 Fast Food(动态规划)
Fast Food My Tags (Edit) Source : Unknown Time limit : 3 sec Memory limit : 32 M Submitted : 3777, A ...
- Mapreduce实验一:WordCountTest
1.确定Hadoop处于启动状态 [root@neusoft-master ~]# jps 23763 Jps3220 SecondaryNameNode3374 ResourceManager293 ...
- codeforces 894B - Ralph And His Magic Field - [数学题]
题目链接:https://cn.vjudge.net/problem/CodeForces-894B Ralph has a magic field which is divided into n × ...
- HDU - 5818 Joint Stacks 比较大の模拟,stack,erase
https://vjudge.net/problem/HDU-5818 题意:给你两个栈AB,有常规push,pop操作,以及一个merge操作,merge A B 即将A.B的元素按照入栈顺序全部出 ...