pthread_create()
函数来创建一个线程。这个函数需要四个参数:线程标识符、线程属性、启动例程和传递给启动例程的参数。在Linux操作系统中,创建线程是一种常见的编程任务,线程允许程序并发执行多个操作,从而提高性能和响应能力,本文将详细介绍如何在Linux中创建一个线程,包括使用POSIX线程库(pthread)的方法。
引入必要的头文件
你需要包含以下头文件:
#include <stdio.h> #include <stdlib.h> #include <pthread.h>
定义线程函数
线程函数是线程开始执行的入口点,它必须接受一个void
类型的参数,并返回一个void
类型的值。
void* thread_function(void* arg) { printf("Hello from the thread! "); return NULL; }
创建线程
使用pthread_create
函数来创建一个新的线程,这个函数需要四个参数:线程标识符、线程属性、线程函数和传递给线程函数的参数,示例如下:
int main() { pthread_t thread_id; int result = pthread_create(&thread_id, NULL, thread_function, NULL); if (result != 0) { fprintf(stderr, "Error creating thread: %d ", result); exit(EXIT_FAILURE); } // 等待线程结束 pthread_join(thread_id, NULL); printf("Thread has finished execution. "); return 0; }
编译和运行
保存上述代码为thread_example.c
,然后使用以下命令进行编译和运行:
gcc -o thread_example thread_example.c -lpthread ./thread_example
你应该会看到输出:
Hello from the thread! Thread has finished execution.
线程同步
在多线程编程中,线程同步是一个关键问题,常用的同步机制包括互斥锁(mutex)和条件变量(condition variable),以下是一个简单的互斥锁示例:
#include <stdio.h> #include <stdlib.h> #include <pthread.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void* thread_function(void* arg) { pthread_mutex_lock(&mutex); printf("Thread %ld is running ", (long)arg); pthread_mutex_unlock(&mutex); return NULL; } int main() { pthread_t threads[3]; for (long i = 0; i < 3; i++) { pthread_create(&threads[i], NULL, thread_function, (void*)i); } for (int i = 0; i < 3; i++) { pthread_join(threads[i], NULL); } return 0; }
编译和运行上述代码,你会看到三个线程依次输出它们的消息。
线程取消
有时你可能需要取消一个线程,可以使用pthread_cancel
函数来实现这一点,以下是一个示例:
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> void* thread_function(void* arg) { while (1) { printf("Thread is running... "); sleep(1); } return NULL; } int main() { pthread_t thread_id; pthread_create(&thread_id, NULL, thread_function, NULL); sleep(3); // 让线程运行一段时间 pthread_cancel(thread_id); // 取消线程 pthread_join(thread_id, NULL); // 等待线程结束 printf("Thread has been canceled. "); return 0; }
编译和运行上述代码,你会看到线程被取消后程序继续执行。
线程局部存储
线程局部存储(TLS)允许每个线程拥有自己的数据副本,使用__thread
关键字可以声明线程局部存储变量,以下是一个示例:
#include <stdio.h> #include <pthread.h> __thread int thread_local_var = 0; void* thread_function(void* arg) { thread_local_var++; printf("Thread local variable: %d ", thread_local_var); return NULL; } int main() { pthread_t threads[3]; for (int i = 0; i < 3; i++) { pthread_create(&threads[i], NULL, thread_function, NULL); } for (int i = 0; i < 3; i++) { pthread_join(threads[i], NULL); } return 0; }
编译和运行上述代码,你会看到每个线程都有自己的局部变量副本。
线程池
线程池是一种管理和复用线程的技术,你可以使用现有的线程池库,如libdispatch
或自己实现一个简单的线程池,以下是一个简单线程池的示例:
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #define THREAD_POOL_SIZE 4 #define NUM_TASKS 10 typedef struct { void (*function)(void*); void* argument; } task_t; pthread_t threads[THREAD_POOL_SIZE]; task_t task_queue[NUM_TASKS]; int task_count = 0; pthread_mutex_t queue_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t queue_cond = PTHREAD_COND_INITIALIZER; void execute_task(task_t* task) { task->function(task->argument); } void* thread_function(void* arg) { while (1) { pthread_mutex_lock(&queue_mutex); while (task_count == 0) { pthread_cond_wait(&queue_cond, &queue_mutex); } task_t task = task_queue[--task_count]; pthread_mutex_unlock(&queue_mutex); execute_task(&task); } return NULL; } void add_task(void (*function)(void*), void* argument) { pthread_mutex_lock(&queue_mutex); if (task_count < NUM_TASKS) { task_queue[task_count++] = (task_t){ .function = function, .argument = argument }; pthread_cond_signal(&queue_cond); } else { printf("Task queue is full "); } pthread_mutex_unlock(&queue_mutex); } void sample_task(void* arg) { printf("Executing task with argument: %d ", *(int*)arg); } int main() { for (int i = 0; i < THREAD_POOL_SIZE; i++) { pthread_create(&threads[i], NULL, thread_function, NULL); } for (int i = 0; i < NUM_TASKS; i++) { int* arg = malloc(sizeof(int)); *arg = i; add_task(sample_task, arg); } for (int i = 0; i < THREAD_POOL_SIZE; i++) { pthread_cancel(threads[i]); // 取消线程池中的线程 } for (int i = 0; i < THREAD_POOL_SIZ
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1396488.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复