C++ Linux服务器多线程开发 - POSIX

多线程

在C++中多线程的实现方法有POSIX与C++11自带库,在本文中将使用POSIX方法。

POSIX

导入库

1
2
#include <iostream>
#include <pthread.h>

POSIX多线程函数基础API

1
2
3
4
5
6
pthread_create()    //创建进程
pthread_exit() //线程终止自身执行
pthread_join() //等待一个线程的结束
pthread_self() //返回线程ID
pthread_cancel() //取消另外一个线程
pthread_kill() //向线程发送信号

创建线程函数

1
int pthread_create(pthread_t *pid,const pthread_attr_r *attr,void *(*start_routine)(void *),void *arg);

参数pid为指针,指向创建完成之后的线程ID。
pthread_t为unsigned long int类型。
attr指向线程属性结构,为pthread_attr_r的指针。
start_routine指向线程函数的地址。
arg指向传给线程函数的参数,成功为0;

pthread_join的作用

pthread_create创建完线程后,主线程仍然会执行pthread_create后面的代码,就会导致主程序已经结束了但是子线程还未创建完的情况出现,所以就需要让主线程等待,所以pthread_join则为阻塞函数。

1
int pthread_join(pthread_t pid,void ** value_ptr);

value_ptr通常可以为NULL,若不为NULL,则pthread_t会复制一份线程退出值去内存区域内,并让*value_ptr指向该内存区域,所以pthread_join还能获得子线程的返回值。

代码演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <thread>
#include <pthread.h>
#include <unistd.h>

using namespace std;

void *threadfunction(void *arg) //线程函数
{
cout << "in threadfunction" << endl;
return (void*)0;
}

int main(int argc, char* argv[])
{
pthread_t tidp;
int ret;
ret = pthread_create(&tidp, NULL, threadfunction, NULL); //创建线程
if (ret)
{
cout << "pthread_create failed:" << ret << endl;
return -1;
}
sleep(1); //main线程挂起1秒,让子线程有机会执行。
cout << "in main thread created." << endl;
return 0;
}

以上代码会输出如下:

1
2
in threadfunction
in main thread created.

C++ Linux服务器多线程开发 - POSIX
http://blog.claret.space/2023/04/24/C++ThreadNotes/
作者
ClaretWheel1481
发布于
2023年4月24日
许可协议