希赛考试网
首页 > 软考 > 软件设计师

linux创建线程的三种方法

希赛网 2024-03-01 16:25:34

在Linux环境下,线程是一种轻量级的进程,可以同时运行多个线程。使用多线程可以有效利用CPU资源,提高程序的性能。本文将从多个角度分析Linux创建线程的三种方法,分别是使用系统调用pthread_create()函数、使用C++11标准库中的std::thread类和使用POSIX标准库中的clone()函数。

一、使用pthread_create()函数创建线程

pthread_create()函数是Linux中常用的创建线程的系统调用。它的头文件为pthread.h,函数原型为:

```C

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);

```

pthread_create()函数接收四个参数:

1.一个指向pthread_t类型变量的指针,用于储存新线程的标识符;

2.一个指向pthread_attr_t类型变量的指针,用于设置新线程的属性;

3.一个指向函数的指针,表示新线程要执行的代码;

4.一个指向void类型的指针,表示传递给新线程的参数。

下面是一个简单的例子:

```C

#include

#include

#include

#include

#include

void *print_message_function(void *ptr);

int main()

{

pthread_t thread1, thread2;

char *message1 = "Hello";

char *message2 = "World";

int iret1, iret2;

iret1 = pthread_create(&thread1, NULL, print_message_function, (void *)message1);

iret2 = pthread_create(&thread2, NULL, print_message_function, (void *)message2);

pthread_join(thread1, NULL);

pthread_join(thread2, NULL);

printf("Thread 1 returns: %d\n", iret1);

printf("Thread 2 returns: %d\n", iret2);

exit(0);

}

void *print_message_function(void *ptr)

{

char *message;

message = (char *)ptr;

printf("%s \n", message);

}

```

该程序创建了两个线程,分别打印"Hello"和"World"。我们可以看到,pthread_create()函数返回值为0时表示线程创建成功。调用pthread_join()函数可以等待线程结束。该程序的输出结果为:

```C

Hello

World

Thread 1 returns: 0

Thread 2 returns: 0

```

二、使用C++11标准库中的std::thread类创建线程

C++11标准库中引入了std::thread类,使得创建和管理线程变得更加方便。它的头文件为 。std::thread类的构造函数有多个版本,最简单的一种只需要传入一个函数指针,表示新线程要执行的函数。下面是一个例子:

```C++

#include

#include

void print_message(const std::string &message);

int main()

{

std::thread t1(print_message, "Hello");

std::thread t2(print_message, "World");

t1.join();

t2.join();

return 0;

}

void print_message(const std::string &message)

{

std::cout << message << std::endl;

}

```

该程序输出结果与上一个例子相同。我们可以看到,std::thread类的使用并不比pthread_create()函数复杂。另外,std::thread类还提供了很多有用的方法,例如joinable()、join()和detach()等。

三、使用POSIX标准库中的clone()函数创建线程

POSIX标准库中的clone()函数可以创建一个新进程或线程。与fork()函数不同,clone()函数可以控制新进程或线程所继承的资源。以下是一个创建线程的例子:

```C

#define _GNU_SOURCE

#include

#include

#include

#include

int thread_func(void *args)

{

char *message = (char *)args;

printf("%s", message);

return 0;

}

int main()

{

char *message = "Hello World!\n";

char *stack = malloc(1024 * 1024); /* allocate 1M of stack memory */

int result = clone(thread_func, stack + (1024 * 1024), CLONE_THREAD | CLONE_SIGHAND, message);

if (result == -1)

{

perror("clone");

exit(EXIT_FAILURE);

}

sleep(1); /* ensure the thread has time to run */

return 0;

}

```

该程序创建了一个新线程,打印"Hello World!"。使用malloc()函数分配了1MB的栈内存。注意,该程序必须在Linux系统中运行;使用CLONE_THREAD标志可以创建新的线程,而CLONE_SIGHAND标志则表示子进程与父进程共享信号处理器。

扫码咨询 领取资料


软考.png


软件设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
软件设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考资格查询系统

扫一扫,自助查询报考条件