`
bbiao
  • 浏览: 72299 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

在C++中实现多线程类

阅读更多

在JAVA中,实现多线程有两种方式,一种是继承自Thread类,一种是Runnable,在MFC中也有CWinThread类,但是我们如何利用已有的多线程的机制来实现一个多线程类呢?

在Windows中使用C语言做多线程编程,我们可以使用两个函数,一个是CreateThread(),该函数是一个Win32 API函数,另一个是_beginthread(),该函数是一个CRT(C Run-Time)函数,二者在使用上没有太大的区别。在本文当中,我将选择使用_beginthread(),需要包含process.h文件。先讲一下这个函数的原型是
        uintptr_t _beginthread( 
                void( __cdecl *start_address )( void * ),
                unsigned stack_size,
                void *arglist
        );
第一个参数指定线程的起始位置;第二个参数指定堆栈的大小,默认可以使用0;第三个参数指定传给start_address的参数列表。按照JAVA中对于多线程类的定义,对于我在C++中实现的多线程类,我将采用下面的声明:
         class Thread
         {
          public:
                void start();
                virtual void run();
        }
用户只要继承该类并重写void run()方法,启动start()方法就可以实现了多线程的想法;于是我是这样实现以上两个方法的:
void Thread::start()
{
        _beginthread(run, o, NULL);
}
void Thread::run()
{
        cout << "Base Thread" << endl;
}
结果编译无法通过,并显示run__cdecl *)( void * )类型不相符,于是自然而然地想到了要做强制类型转换,可是无论使用什么方法都没有成功,为什么呢?对于这一点,在类的成员函数中,每个函数都有一个默认的参数this,而且该参数是隐式传入的,所以我没有取得成功(对于这一点我还是有点不太清楚,望高手解答。)后来和同学一起讨论这个问题,他说起可以在类的内部定义一个静态方法来解决这个问题,这是个很好的主意;于是将该线程类的声明改写成:
class Thread
{
public:
        void start();
        virtual void run();
        HANDLE getThread();
private:
        HANDLE hThread;
        static void agent(void *p);
};其中agent方法是一个这个类里最大的改进,它是一个静态方法,但是它是被声明为私有的方法,只有在内部才可以被调用,整个类从start启动,然后由它来通过创建一个新的线程执行run();整个函数的具体实现如下:(完整代码,在Visual Studio 2005, WIndows XP SP2下测试通过),注意,请在Project -> Properties里选择C/C++里选择Code Generation里选择Runtime Library里选择Multi-threaded Debug(/MTd) 
/*
 * Thread.h
 */
#ifndef THREAD_H
#define THREAD_H
#include <process.h>
#include <iostream>

using std::cin;
using std::cout;
using std::endl;

typedef void *HANDLE;
class Thread
{
public:
        void start();
       virtual void run();
       HANDLE getThread();
private:
       HANDLE hThread;
       static void agent(void *p);
};

void Thread::start()
{
       hThread =(HANDLE)_beginthread(agent, 0, (void *)this);
}
void Thread::run()
{
       cout << "Base Thread" << endl;
}
void Thread::agent(void *p)
{
       Thread *agt = (Thread *)p;
       agt->run();
}
HANDLE Thread::getThread()
{
       return hThread;
}
#endif //THREAD_H
测试文件
#include "Thread.h"
#include <windows.h>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

class DerivedThread: public Thread
{
public:
        void run();
};
void DerivedThread::run()
{
        cout << "Derived Thread" << endl;
}
int main(int argc, char *argv[])
{
        DerivedThread *dt = new DerivedThread();
        dt->start();
        WaitForSingleObject(dt->getThread(), INFINITE);
}
运行显示:
Derived Thread
成功!
      

分享到:
评论

相关推荐

    C++实现多线程文件复制.docx

    C++实现多线程文件复制 在文件复制过程中,多线程技术可以大大提高复制速度。下面将详细介绍C++实现多线程文件复制的知识点。 一、多线程文件复制的基本概念 多线程文件复制是指在文件复制过程中,使用多个线程...

    C++11实现多线程电梯运行

    在这个“C++11实现多线程电梯运行”的项目中,开发者利用C++11的线程库来模拟电梯的运行状态和行为,以提高模拟的真实感和效率。 首先,我们需要理解C++11中的`std::thread`库。这个库提供了一种创建新线程的方法,...

    LOG文件c++实现,多线程写入

    实现多线程日志写入时,主要挑战在于如何确保线程安全。一种常见的方法是使用互斥量(`std::mutex`)来确保在任何时候只有一个线程可以访问日志文件。在C++11及更高版本中,可以利用`std::lock_guard`来自动管理锁的...

    12.如何实现多线程多任务?(Visual C++编程 源代码)

    12.如何实现多线程多任务?(Visual C++编程 源代码)12.如何实现多线程多任务?(Visual C++编程 源代码)12.如何实现多线程多任务?(Visual C++编程 源代码)12.如何实现多线程多任务?(Visual C++编程 源代码)...

    现代多线程 JAVA和c++多线程实现 测试和调试

    本资源主要探讨了如何在JAVA和C++中实现多线程,以及相关的测试和调试技术。 在JAVA中,多线程的实现主要依赖于`Thread`类和`Runnable`接口。开发者可以通过直接继承`Thread`类或实现`Runnable`接口来创建新的线程...

    c++实现多线程同步

    通过分析和学习这个示例,你可以更好地理解如何在Windows环境下用C++实现多线程同步。 总之,C++的多线程功能使得开发者能够充分利用现代硬件的并行处理能力,而信号量作为一种有效的同步工具,可以防止数据竞争,...

    C++利用多线程实现类操作

    ### C++多线程实现类...通过对代码的详细解读,我们不仅学习到了如何在C++中实现多线程编程,还了解了如何进行高效的文件读写操作,以及如何处理随机数据生成等问题。这对于理解和掌握C++高级编程技巧具有重要意义。

    C++ 多线程日志记录

    本文将深入探讨如何使用C++实现多线程日志记录,包括涉及的关键概念、技术以及如何通过提供的文件`log.cpp`、`log.h`和`readme.txt`来理解和应用这些知识。 首先,我们要理解多线程的概念。在C++中,通过 `&lt;thread&gt;...

    c++ builder 多线程

    在C++ Builder中实现多线程,主要是利用了其内置的VCL(Visual Component Library)框架和RTL(Run-Time Library)库,这两个组件库提供了对Windows API的封装,支持创建并发执行的线程。 ### 一、C++ Builder中的...

    C++ 实现多线程文件传输的设计与实现

    本文将深入探讨如何利用C++实现多线程文件传输的设计与实现。 一、多线程基础 多线程是指在一个进程中创建并同时运行多个执行线程,它们共享同一内存空间,可以并发执行不同的任务。在C++11及以后的版本中,标准库...

    c++11多线程实现libx264编码

    4. **C++11多线程实现libx264编码**:在视频编码过程中,通常可以将不同任务分配到不同线程,例如一个线程负责读取原始视频帧,另一个线程负责编码,还有一个线程可能负责将编码后的数据写入文件或发送到网络。...

    C++多线程封装成类使用示例

    在C++编程中,多线程是实现并发执行任务的关键技术。C++11标准引入了内置的`&lt;thread&gt;`库,使得多线程编程变得更加简单。本示例将详细介绍如何将C++的多线程功能封装成一个类,以便在实际项目中更加灵活地使用。 ...

    C++实现多线程通信

    在本篇文章中,我们将深入探讨如何在C++中实现多线程通信,以及相关的同步机制和数据交换策略。 一、线程创建与管理 在C++11及以后的标准中,C++提供了`std::thread`库来支持线程的创建和管理。创建一个新线程可以...

    C++多线程SOCKET收发

    在C++编程中,多线程SOCKET收发是一项重要的技术,它允许程序同时处理多个网络连接,提高系统的并发性能。下面将详细讲解这个主题,包括C++中的多线程概念、SOCKET基础以及如何结合两者实现数据的收发。 首先,让...

    C++封装类CWSocket(多线程 非阻塞)

    通过阅读和分析这些代码,我们可以深入了解如何在C++中实现多线程、非阻塞的socket类,以及如何添加超时控制。 总的来说,C++封装类CWSocket的实现结合了多线程、非阻塞I/O和超时处理等关键技术,旨在提供一个高效...

    C++多线程内存池和简单的BUFFER类

    接下来,我们讨论多线程中的缓冲区(BUFFER类)。缓冲区是一种用于存储临时数据的数据结构,它可以提升I/O操作的效率,减少不必要的数据复制。在多线程环境下,一个线程可能需要写入数据到缓冲区,而其他线程则读取...

    sqlite数据库c++类封装,及源码实例,boost多线程

    在`frogAndheffalump`这个文件中,可能包含了具体的源代码实现,包括C++的SQLite封装类和使用Boost多线程的例子。通过阅读和分析这些源码,你可以了解到如何将SQLite与C++结合,以及如何在多线程环境下正确使用它们...

    基于VS2010的C++多线程开发Demo

    在C++编程中,多线程技术是一种提升程序性能的重要手段,特别是在Visual Studio 2010这样的开发环境中。本文将深入探讨如何使用VS2010进行C++多线程开发,通过一个具体的Demo来阐述相关概念和技术。 首先,我们要...

    C++面向对象多线程编程

    C++作为一门强大的静态类型语言,提供了丰富的库支持来实现多线程,如STL中的`&lt;thread&gt;`库,以及C++11及后续标准引入的并发工具。书中将详细讲解这些工具的使用方法和最佳实践。 首先,本书会介绍C++中的线程基础,...

Global site tag (gtag.js) - Google Analytics