软考
APP下载

linux创建线程的三种方法

在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标志则表示子进程与父进程共享信号处理器。

备考资料 免费领取:软件设计师报考指南+考情分析+思维导图等 立即下载
真题演练 精准解析历年真题,助你高效备考! 立即做题
相关阅读
软件设计师题库