在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++实现多线程文件复制 在文件复制过程中,多线程技术可以大大提高复制速度。下面将详细介绍C++实现多线程文件复制的知识点。 一、多线程文件复制的基本概念 多线程文件复制是指在文件复制过程中,使用多个线程...
在这个“C++11实现多线程电梯运行”的项目中,开发者利用C++11的线程库来模拟电梯的运行状态和行为,以提高模拟的真实感和效率。 首先,我们需要理解C++11中的`std::thread`库。这个库提供了一种创建新线程的方法,...
实现多线程日志写入时,主要挑战在于如何确保线程安全。一种常见的方法是使用互斥量(`std::mutex`)来确保在任何时候只有一个线程可以访问日志文件。在C++11及更高版本中,可以利用`std::lock_guard`来自动管理锁的...
12.如何实现多线程多任务?(Visual C++编程 源代码)12.如何实现多线程多任务?(Visual C++编程 源代码)12.如何实现多线程多任务?(Visual C++编程 源代码)12.如何实现多线程多任务?(Visual C++编程 源代码)...
本资源主要探讨了如何在JAVA和C++中实现多线程,以及相关的测试和调试技术。 在JAVA中,多线程的实现主要依赖于`Thread`类和`Runnable`接口。开发者可以通过直接继承`Thread`类或实现`Runnable`接口来创建新的线程...
通过分析和学习这个示例,你可以更好地理解如何在Windows环境下用C++实现多线程同步。 总之,C++的多线程功能使得开发者能够充分利用现代硬件的并行处理能力,而信号量作为一种有效的同步工具,可以防止数据竞争,...
### C++多线程实现类...通过对代码的详细解读,我们不仅学习到了如何在C++中实现多线程编程,还了解了如何进行高效的文件读写操作,以及如何处理随机数据生成等问题。这对于理解和掌握C++高级编程技巧具有重要意义。
本文将深入探讨如何使用C++实现多线程日志记录,包括涉及的关键概念、技术以及如何通过提供的文件`log.cpp`、`log.h`和`readme.txt`来理解和应用这些知识。 首先,我们要理解多线程的概念。在C++中,通过 `<thread>...
在C++ Builder中实现多线程,主要是利用了其内置的VCL(Visual Component Library)框架和RTL(Run-Time Library)库,这两个组件库提供了对Windows API的封装,支持创建并发执行的线程。 ### 一、C++ Builder中的...
本文将深入探讨如何利用C++实现多线程文件传输的设计与实现。 一、多线程基础 多线程是指在一个进程中创建并同时运行多个执行线程,它们共享同一内存空间,可以并发执行不同的任务。在C++11及以后的版本中,标准库...
4. **C++11多线程实现libx264编码**:在视频编码过程中,通常可以将不同任务分配到不同线程,例如一个线程负责读取原始视频帧,另一个线程负责编码,还有一个线程可能负责将编码后的数据写入文件或发送到网络。...
在C++编程中,多线程是实现并发执行任务的关键技术。C++11标准引入了内置的`<thread>`库,使得多线程编程变得更加简单。本示例将详细介绍如何将C++的多线程功能封装成一个类,以便在实际项目中更加灵活地使用。 ...
在本篇文章中,我们将深入探讨如何在C++中实现多线程通信,以及相关的同步机制和数据交换策略。 一、线程创建与管理 在C++11及以后的标准中,C++提供了`std::thread`库来支持线程的创建和管理。创建一个新线程可以...
在C++编程中,多线程SOCKET收发是一项重要的技术,它允许程序同时处理多个网络连接,提高系统的并发性能。下面将详细讲解这个主题,包括C++中的多线程概念、SOCKET基础以及如何结合两者实现数据的收发。 首先,让...
通过阅读和分析这些代码,我们可以深入了解如何在C++中实现多线程、非阻塞的socket类,以及如何添加超时控制。 总的来说,C++封装类CWSocket的实现结合了多线程、非阻塞I/O和超时处理等关键技术,旨在提供一个高效...
接下来,我们讨论多线程中的缓冲区(BUFFER类)。缓冲区是一种用于存储临时数据的数据结构,它可以提升I/O操作的效率,减少不必要的数据复制。在多线程环境下,一个线程可能需要写入数据到缓冲区,而其他线程则读取...
在`frogAndheffalump`这个文件中,可能包含了具体的源代码实现,包括C++的SQLite封装类和使用Boost多线程的例子。通过阅读和分析这些源码,你可以了解到如何将SQLite与C++结合,以及如何在多线程环境下正确使用它们...
在C++编程中,多线程技术是一种提升程序性能的重要手段,特别是在Visual Studio 2010这样的开发环境中。本文将深入探讨如何使用VS2010进行C++多线程开发,通过一个具体的Demo来阐述相关概念和技术。 首先,我们要...
C++作为一门强大的静态类型语言,提供了丰富的库支持来实现多线程,如STL中的`<thread>`库,以及C++11及后续标准引入的并发工具。书中将详细讲解这些工具的使用方法和最佳实践。 首先,本书会介绍C++中的线程基础,...