【C++编程】C++实现多线程编程

在C++的多线程编程实现里有两种方式,一种是Windows头文件里的CreateProcess,另一种是process.h里的_beginthread,我这里用的是后一种,并且将多线程操作封装成了类似Java里的Thread类。

Thread类包含四种操作(对应线程的几种状态):就绪(start),挂起(suspend)、恢复(resume)以及终止(terminate),另外,还包含了一个可以设置线程超时的操作。



Thread类代码如下(Thread.h):

#ifndef THREAD_H
#define THREAD_H
#include <windows.h>
#include <process.h>
typedef void *HANDLE;
class Thread
{
public:
    Thread();                               //构造器

    void         start();                   //线程启动函数
    virtual void run();                     //线程运行函数
    int          suspend();                 //线程挂起,返回之前挂起次数
    int          resume();                  //线程恢复,返回之前的挂起次数
    void         terminate();               //强行终止进程
    void         setTimeOut(DWORD time);    //设置超时时间,默认为INFINITE
    DWORD        getTimeOut();              //返回超时时间

private:
    HANDLE m_h;                             //当前线程的句柄
    DWORD  m_timeout;                       //超时时间
    static void init(void *_h);             //运行当前线程
};

#endif

实现文件(Thread.cpp):


#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include "Thread.h"

Thread::Thread(){
    m_timeout = INFINITE;               //设置默认的超时,为无穷大
}

void Thread::start()
{
    m_h = (HANDLE)_beginthread(init, 0, (void *)this);      //创建线程

}
void Thread::run()
{
    //线程运行方法
}

void Thread::init(void* _h){
    Thread *t = (Thread*)_h;
    t->run();
    DWORD dw = WaitForSingleObject(t->m_h, t->m_timeout); //等待线程,500ms后超时结束,INFINITE表示不超时
    switch (dw)
    {
    case WAIT_OBJECT_0:
        break;
    case WAIT_TIMEOUT: cout << "Time Out" << endl;
        break;
    case WAIT_FAILED:
        break;
    }
}

//线程挂起,返回之前挂起次数
int Thread::suspend(){
    return SuspendThread(this->m_h);
}

//线程恢复,返回之前的挂起次数
int Thread::resume(){
    DWORD re = ResumeThread(this->m_h);
    return re;
}

//强行终止进程
void Thread::terminate(){
    TerminateThread(this->m_h, EXIT_SUCCESS);
}

//设置超时时间,默认为INFINITE
void Thread::setTimeOut(DWORD time){
    this->m_timeout = time;
}
//返回超时时间
DWORD Thread::getTimeOut(){
    return this->m_timeout;
}

测试文件(TestThread.cpp):

 //测试文件
#include "Thread.h"

#include <windows.h>
#include <process.h>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
#include <string>
using std::string;

class TestThread : public Thread
{
public:
    TestThread(string _s){
        s = _s;
    }
    string s;
    void run();
};

void TestThread::run()
{
    for (int i = 0; i < 10; i++){
        cout <<s+"\n";
    }

}

int main(int argc, char *argv[])
{
    TestThread *dt[10];
    dt[0] = new TestThread("A");        //新建线程A
    dt[1] = new TestThread("B");        //新建线程B
    dt[0]->start();                     //开启线程A
    cout<<dt[0]->suspend()<<endl;       //挂起线程A
    dt[1]->setTimeOut(500);
    dt[1]->start();                     //开启线程B

    Sleep(2000);                        //暂停2s,此时线程A仍属于挂起状态,所以不执行
    dt[0]->resume();                    //恢复线程A,此时线程A属于恢复状态,继续执行

    getchar();
}

测试结果如图:

时间: 2024-10-05 04:44:44

【C++编程】C++实现多线程编程的相关文章

多核编程 与 单核多线程编程的区别

1.锁竞争: 单核中,如果单个线程取得所,则获取CPU运行时间,其他等待获取锁的线程被阻塞.使用了锁,影响的只是枷锁和解锁的耗时,CPU始终运行. 多核中,若2个(更多)线程使用同一把锁,则会导致CPU饥饿.实际还是串行化执行! 2.线程分解和执行的区别: 对单核CPU,对客户端软件,采用多线程,主要是 创建多线程将一些计算放在后台执行,而不影响用户交互操作.(用户界面 & 其他计算 并行进行)提高用户的操作性能! 多核中,分别出多个线程,不再限于将用户界面操作和其他计算分离.分解多个线程使为了

新手浅谈Task异步编程和Thread多线程编程

初学Task的时候上网搜索,看到很多文章的标题都是task取代thread等等相关,我也一直以为task和thread是一类,其实task是.net4.0提出的异步编程,在之前.net1.0有delegete.beginInoke(XXXX),还有.net2.0中的EAP,在最新的4.5中又有async.await这种新的异步编程.而Thread和Threadpool则是多线程编程. 但是Task也是把任务推到线程池中 1 static void Main(string[] args) 2 {

《Python核心编程》18.多线程编程(三)

18.6使用threading模块 #!/usr/bin/env python # -*- coding:utf-8 -*- """从Thread类中派生出一个子例,创建一个这个子类的实例""" import threading from time import sleep, ctime loops = (4, 2) class MyThread(threading.Thread): """ 1.子类化Thread类

《Python核心编程》 18.多线程编程(一)

一进程和线程 1参考链接: http://www.zhihu.com/question/25532384 中OF小工和zhonyong 的回答 总结他们两的回答: 引言: 1.电脑的运行,在硬件上是CPU.相关寄存器.RAM之间的事情.负责处理任务的顺序有CPU决定. 2.程序的上下文:当CPU处理任务时,所需要的各种资源(显卡.寄存器等)准备完毕,构成了这个程序的执行环境,即上下文. 3.CPU处理任务顺序:先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程

Socket多线程编程 serversocket服务器多线程编程

服务器代码 package com.lotus.server; import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.ServerSocket;

《Python核心编程》18.多线程编程(二)

18.1没有线程支持 #!/usr/bin/env python # -*- coding:utf-8 -*- from time import sleep, ctime def loop0(): print 'start loop 0 at:', ctime() sleep(4) print 'loop 0 done at', ctime() def loop1(): print 'start loop 1 at:', ctime() sleep(2) print 'loop 1 done a

第73课 Qt中的多线程编程

1. QThread类 (1)QThread是一个跨平台的多线程解决方案 (2)QThread以简洁易用的方式实现多线程编程 2. QThread中的关键成员函数 (1)virtual void run() :线程函数,用于定义线程功能(执行流). (2)void start():启动函数,将线程入口地址设置为run函数.启动线程,新线程开始执行run函数. (3)int exec():进入事件循环,直至调用exit().返回线程退出事件循环的返回码. (4)void terminate():强

线程同步-iOS多线程编程指南(四)-08-多线程

首页 编程指南 Grand Central Dispatch 基本概念 多核心的性能 Dispatch Sources 完结 外传:dispatch_once(上) Block非官方编程指南 基础 内存管理 揭开神秘面纱(上) 揭开神秘面纱(下) iOS多线程编程指南 关于多线程编程 线程管理 Run Loop 线程同步 附录 Core Animation编程指南 Core Animation简介 基本概念 渲染架构 几何变换 查看目录 中文手册/API ASIHTTPRequest Openg

Linux多线程编程-互斥锁

互斥锁 多线程编程中,(多线程编程)可以用互斥锁(也称互斥量)可以用来保护关键代码段,以确保其独占式的访问,这有点像二进制信号量.POSIX互斥锁相关函数主要有以下5个: #include <pthread.h> int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); int pthread_mutex_destroy(pthread_mutex_t *mutex); int p

android: 多线程编程基础

9.1   服务是什么 服务(Service)是 Android 中实现程序后台运行的解决方案,它非常适合用于去执行那 些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使 当程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行. 不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务 时所在的应用程序进程.当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停 止运行. 另外,也不要被服务的后台概念所迷惑,实际上服务并不会