在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类,使得创建和管理线程变得更加方便。它的头文件为
```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标志则表示子进程与父进程共享信号处理器。
扫码咨询 领取资料