在 Linux 或 Unix 系统中,使用 pthread_create
函数可以创建新线程。下面是创建线程的步骤:
1. 包含头文件 📂
#include <pthread.h>
#include <stdio.h> // 用于输入输出(如 printf)
2. 定义线程函数 🧑💻
线程函数必须符合以下原型:
void* thread_function(void* arg);
-
参数 :
void* arg
是传递给线程的参数(可以是任意类型的数据指针)。 -
返回值 :线程结束时返回一个
void*
类型的指针。
示例:
void* print_message(void* arg) {
char* message = (char*)arg;
printf("%s\n", message);
return NULL; // 线程返回值(若无返回值可返回 NULL)
}
3. 创建线程 🧵
使用 pthread_create
函数创建线程:
int pthread_create(
pthread_t* thread_id, // 输出参数,保存新线程的 ID
const pthread_attr_t* attr, // 线程属性(通常设为 NULL 使用默认属性)
void* (*start_routine)(void*), // 线程函数指针
void* arg // 传递给线程函数的参数
);
示例代码:
int main() {
pthread_t thread_id; // 存储新线程的 ID
char* message = "Hello from thread!";
// 创建线程
int result = pthread_create(
&thread_id, // 保存线程 ID
NULL, // 默认属性
print_message,// 线程函数
(void*)message // 参数(强制转换为 void*)
);
if (result != 0) {
perror("Failed to create thread");
return 1;
}
// 等待线程结束(可选)
pthread_join(thread_id, NULL);
printf("Main thread exits.\n");
return 0;
}
4. 编译并链接线程库 💻
在终端中使用 gcc
编译时,需添加 -lpthread
选项链接线程库:
gcc program.c -o program -lpthread
关键注意事项 ⚠️
-
参数传递:
-
若需传递多个参数,可以将数据封装到结构体中:
struct ThreadArgs { int num; char* text; };
-
在线程函数中通过类型转换获取参数:
void* thread_func(void* arg) { struct ThreadArgs* args = (struct ThreadArgs*)arg; // 使用 args->num 和 args->text }
-
-
线程生命周期:
-
主线程退出时,所有子线程会被强制终止。若需等待子线程结束,需使用
pthread_join
。 -
使用
pthread_detach
可让线程在结束后自动释放资源。
-
-
线程安全:
- 多线程访问共享数据时需使用互斥锁(
pthread_mutex_t
)或条件变量(pthread_cond_t
)。
- 多线程访问共享数据时需使用互斥锁(
完整示例代码 🔧
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void* print_message(void* arg) {
char* message = (char*)arg;
printf("Thread says: %s\n", message);
return NULL;
}
int main() {
pthread_t thread_id;
char* message = "Hello World!";
// 创建线程
if (pthread_create(&thread_id, NULL, print_message, (void*)message)) {
fprintf(stderr, "Error creating thread\n");
return 1;
}
// 等待线程结束
pthread_join(thread_id, NULL);
printf("Main thread exits.\n");
return 0;
}
通过以上步骤,即可成功创建并运行一个新线程。