您的位置:首页 > 运维架构 > Linux

linux下创建多线程执行

2016-06-29 16:39 447 查看
linux下创建多线程执行

   

    线程(thread, 台湾称“执行绪”)是“进程”中某个单一顺序的控制流。也被称为轻量进程(lightweight processes)。计算机科学术语,指运行中的程序的调度单位。
    线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

    下面将介绍一下几种类型的多线程程序涉及:

1.POSIX线程(Pthreads):在POSIX线程中,线程体是一个函数。用pthread_create函数来启动这个线程。用pthread_join函数来等待线程结束

相关函数:

pthread_create()函数用于创建线程。返回值为创建线程失败时的错误码;若返回0,表示线程创建成功。
pthread_exit()函数用于结束当前线程。
pthread_join()函数用于等待线程运行结束。

UNIX International 线程
thr_create()函数用于创建线程。
thr_join()函数用于等待线程运行结束。
thr_suspend()函数用于挂起线程。
thr_continue()函数用于恢复被挂起的线程。
thr_exit()函数用于结束当前线程。
thr_self()函数用于返回当前线程的线程标识符。

2.Win32线程:在Win32线程中,线程体是一个函数。用CreateThread函数来启动这个线程。用WaitForSingleObject函数来等待线程结束。

相关函数:

CreateThread()函数用于创建线程;返回值为所创建线程的句柄。
ExitThread()函数用于结束本线程。
SuspendThread()函数用于挂起指定的线程。
ResumeThread()函数递减指定线程的挂起计数,挂起计数为0时,线程恢复执行。

3.C++ 11 线程:在C++ 11中,线程体是一个函数。在C++11中的STL中,std命名空间中收录了thread类。该类的构造函数的第一个参数就是指向一个线程函数的函数指针。thread类的构造函数被调用时,该线程即刻启动。
相关函数:

std::thread::thread(),构造函数,用于创建线程。
std::thread::join(),用于等待线程运行结束。
std::thread::detach(),用于让线程不受句柄控制。
std::thread::swap(),用于交换两个线程。
std::thread::get_id(),用于获得线程ID号。
std::thread::joinable(),用于判断线程是否可等待。
std::thread::native_handle(),用于获得与操作系统相关的原生线程句柄。

4.Java线程:在Java中,线程体是从Thread类继承的run()方法,或实现Runnable接口的类中的run()方法。当线程产生并初始化后,实时系统调用它的run()方法。run()方法内的代码实现所产生线程的行为,它是线程的主要部分。

相关函数:

start(),启动线程。
join(),等待线程运行完毕。
sleep(),让线程休眠一段时间。
setPriority(),设置线程优先级。

 
在这,主要介绍的是在linux下的POSIX线程实现。

首先看一个具体的简单的具体实现代码:

//编译时候最后加上静态库的加载:g++ -o thread thread.cpp -lpthread
#include <pthread.h>
#include <iostream>
using namespace std;
//定义成指针函数,且参数void *ptr需要带上
void *hello(void *ptr)
{
sleep(1);
cout << "Hello from thread \n" << std::endl;
}

int main()
{
pthread_t id;
//线程创建,返回值为0
int ret = pthread_create(&id,NULL,hello,NULL);
cout<<"Main Thread \n"<<std::endl;
//等待一个线程的结束,线程间同步的操作
pthread_join(id,NULL);
cout<<"Main Thread end \n"<<std::endl;
return 0;
}

具体语法实现可直接看代码中的备注。这里需要注意的是这是在linux下实现的,并且编译的时候需要将静态库链接进来,具体编译命令如下:
<span style="font-size:18px;">g++ -o thread thread.cpp -lpthread</span>


执行效果如图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息