1、UNIX多线程
1.1 概述
UNIX多线程是采用面向过程的设计,所有的使用单位都是函数,同时UNIX线程是一个进程内部的一个控制序列,同一个进程内的所有线程都共处同一个地址空间。
1.2 创建
对于UNIX多线程的使用方式,也非常简单。只需在通过pthread_create函数创建线程时,设置相应的启动函数并传递给启动函数相应参数,当创建完成后线程立即启动。而其它的多线程特性可以参考其它资料。
如下是UNIX多线程的创建实例:
-
void *pthread_main(void*)
-
{
-
printf("hello,world\n");
-
return NULL;
-
}
-
-
void thread()
-
{
-
pthread_t pID;
-
pthread_create(&pID, NULL, pthread_main, NULL);
-
}
-
输出:
-
hello,world
2、C++多线程
2.1 概述
在C++ 98标准中没有语言级别的并发支持,因为在C++诞生很久之后才出现多线程等并发概念。由于UNIX多线程设计是面向过程的概念,而C++主要特性是面向对象,当然C++也可以采用面向过程的思想使用UNIX多线程,但这不符合C++的设计思想。
所以本文介绍如何以C++的面向对象思想使用UNIX的多线程设计,从而提高软件设计的效率。
2.2 创建
在同一个进程中的多线程是处于同一个地址空间内,即只要知道一个线程的地址,就能够在另一个线程中访问该地址的内容,本文即介绍同一个进程中的多线程使用方式。
C++创建多线程与UNIX创建方式类似,只是指定线程的启动函数和传递参数不同。可以给pthread_create函数传递C++类的静态成员函数和该类的对象指针,因为在不同线程之间的地址是处于同一个地址空间内,所以其他线程也可以访问到。
从而通过这种方式,在C++类的静态方法中操作本身类的成员或成员函数,即使本身的成员是私有类型,在静态方法中依然能够使用。
如下是使用C++创建多线程的简单实例:
-
class Thread
-
{
-
public:
-
static void* mainMethod(void *bt)
-
{
-
Thread *bt = (Thread*)vbt;
-
printf("age:%d\n",bt->age);
-
-
bt->height = 34;
-
printf("height:%d\n",bt->height);
-
return vbt;
-
}
-
public:
-
int age;
-
private:
-
int height;
-
};
-
-
void thread() //其他函数或类成员方法中创建新的线程
-
{
-
Thread *bt = new Thread();
-
bt->age = 23;
-
-
pthread_t pt;
-
pthread_create(&pt, NULL, Thread::mainMethod, (void*)bt);
-
}
-
输出:
-
age:23
-
height:34
3、boost多线程
3.1 概述
在boost的多线程使用方式与UNIX的使用方式类似,但boost创建方式只需指定线程启动函数和传递的函数实参,而无需再配置其它参数。一样在创建线程后,立即执行启动函数,不需要调用类似start()、begin()类似的函数。
3.2 创建
boost的多线程创建方式也是基于面向过程的设计,若按面向对象的思想使用时,可以按C++的使用方式进行创建,即创建线程时传递C++的静态成员函数和该类对象的指针。不同的是在传递和接收时,不需进行类型转换。
-
class boostThread
-
{
-
public:
-
static void* mainMethod(boostThread *bt) //不需类型转换
-
{
-
printf("age:%d\n",bt->age);
-
bt->height = 34;
-
printf("height:%d\n",bt->height);
-
return bt;
-
}
-
public:
-
int age;
-
private:
-
int height;
-
};
-
void thread() //其他函数或类成员方法中创建新的线程
-
{
-
Thread *bt = new Thread();
-
bt->age = 23;
-
thread td(boostThread::mainMethod, bt); //不需类型转换
-
}
-
输出:
-
age:23
-
height:34