c++多线程实例

#include <windows.h>
#include <stdio.h>
#include <process.h>

int g_ntotal = 100;
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 = 0;
    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 = 0;//计算结果初始化

    QueryPerformanceCounter(&hcounter1);//获取当前时间保存到 hcounter1 中,实参是指向64位整数的指针

    int i;
    THREAD_DATA *pdata;//THREAD_DATA是本程序中自己定义的结构体
    for (i = 1; i < num_processors; ++i)
    {
        pdata = new THREAD_DATA;
        pdata->thread_id = i + 1;
        pdata->num_threads = num_processors;//值为2
        _beginthread(sum_func, 0, pdata);
    }

    pdata = new THREAD_DATA;
    pdata->thread_id = 1;
    pdata->num_threads = num_processors;//值为2
    sum_func(pdata);

    while (1)
    {
        int itemp;
        WaitForSingleObject(g_thread_lock, INFINITE);
        itemp = g_thread_counter;//系统支持的线程数,值为2
        ReleaseMutex(g_thread_lock);
        if (itemp == 0) 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创建的互斥体关闭
}
时间: 2024-10-05 05:05:59

c++多线程实例的相关文章

java swing实现的多线程实例代码教程-赛马demo

代码下载:http://www.zuidaima.com/share/1825492473826304.htm 原文:java swing实现的多线程实例代码教程-赛马demo 项目截图: 运行截图: java swing实现的多线程实例代码教程-赛马demo,布布扣,bubuko.com

Java多线程-实例解析

Java多线程实例 3种实现方法Java中的多线程有三种实现方式:1.继承Thread类,重写run方法.Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法.2.实现Runnable接口,并实现该接口的run()方法.创建一个Thread对象,用实现的Runnable接口的对象作为参数实例化Thread对象,调用此对象的start方法.3.实现Callable接口,重写call方法.Callable接口与Ru

Linux多线程实例练习 - pthread_cancel()

Linux多线程实例练习 - pthread_cancel 1.代码 xx_pthread_cancel.c #include <pthread.h> #include <stdio.h> #include <unistd.h> #define debug_Msg(fmt, arg...) do{ printf("%s %d : ", __FILE__, __LINE__); printf(fmt, ##arg); }while(0) #define

Java Tread多线程(0)一个简单的多线程实例

作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多线程时,一般步骤: 1)继承Thread函数. 2)覆盖run函数. 注意:1)main函数为主线程,main里面存放的是主线程的执行代码: Demo1为子线程,里面的run函数里面存放的是子线程需要执行的代码:其中,本文中主线程和子线程执行的优先级是一样的. 2)启动线程必须用start()启动,

线程vs进程,多线程实例

进程VS线程 功能 进程,能够完成多任务,比如 在一台电脑上能够同时运行多个QQ 线程,能够完成多任务,比如 一个QQ中的多个聊天窗口 定义的不同 进程是系统进行资源分配最小单元. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序执行的需要的cpu资源),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源(主要是内存资源). 区别 一个程序至少有一个进程,一个进程至少有一个线程

Python 多线程 实例

多线程实例 1 import threading 2 import time 3 4 5 def eat(): 6 eatTime = time.time() 7 for i in range(30): 8 print('count = {}'.format(count)) 9 time.sleep(1) 10 print 'eat something in {}'.format(eatTime) 11 return eatTime 12 13 def playGame(): 14 playTi

多线程实例

本文摘自网络,只用作学习,如原作者有任何意见,可以留言,即删. 前言 线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,如线程之间怎样同步.互斥,这些东西将在本文中介绍.我在某QQ群里见到这样一道面试题: 是否熟悉POSIX多线程编程技术?如熟悉,编写程序完成如下功能: 1)有一int型全局变量g_Flag初始值为0: 2) 在主线称中起动线程1,打印“this is thread1”,并将g_Flag设置为1 3) 在主线称中启动线程2,打印

java多线程实例

Java的多线程机制 实例一: //题目:有三个线程分别打印A.B.C,请用多线程编程实现,在屏幕上循环打印10次ABCABC- public class SleepExample extends Thread {            private static int currentCount = 0;            public SleepExample(String name) {            this.setName(name);        }         

QT多线程实例

自定义信号与槽 Qt多线程简单实现 多线程间变量传递 工程结构 主线程类: //export_key.h#ifndef EXPORT_KEY_H#define EXPORT_KEY_H#include "main_widget.h"namespace Ui { class export_key; } class texport_work; class export_key : public QWidget {     Q_OBJECTpublic:    explicit export

【原创】Kafka Consumer 多线程 实例

Kafka 0.9版本开始推出了Java版本的consumer,优化了coordinator的设计以及摆脱了对zookeeper的依赖.社区最近也在探讨正式用这套consumer API替换Scala版本的consumer的计划.鉴于目前这方面的资料并不是很多,本文将尝试给出一个利用KafkaConsumer编写的多线程消费者实例,希望对大家有所帮助. 这套API最重要的入口就是KafkaConsumer(o.a.k.clients.consumer.KafkaConsumer),普通的单线程使