在C语言中,多线程编程是一种常见的并行处理技术。当需要子线程在完成特定任务后通知主线程执行回调操作时,我们可以通过以下几种方法实现:
1. 使用信号量(Semaphore)
信号量是一种同步机制,可以用来控制对共享资源的访问。在多线程环境中,信号量可以用来通知主线程子线程已经完成了任务。
1.1 创建信号量
#include <pthread.h>
pthread_mutex_t mutex;
pthread_cond_t cond;
void *thread_function(void *arg) {
// 子线程执行任务
pthread_mutex_lock(&mutex);
// 通知主线程
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t thread_id;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
pthread_create(&thread_id, NULL, thread_function, NULL);
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
// 主线程执行回调操作
printf("回调操作执行完毕\n");
pthread_join(thread_id, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
1.2 注意事项
- 使用信号量时,需要确保互斥锁(mutex)的使用正确,以避免竞态条件。
- 信号量只能通知一个等待的线程,如果需要通知多个线程,可以使用多个信号量。
2. 使用条件变量(Condition Variable)
条件变量是一种更高级的同步机制,可以与互斥锁一起使用,实现线程间的通信。
2.1 创建条件变量
#include <pthread.h>
pthread_mutex_t mutex;
pthread_cond_t cond;
void *thread_function(void *arg) {
// 子线程执行任务
pthread_mutex_lock(&mutex);
// 通知主线程
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t thread_id;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
pthread_create(&thread_id, NULL, thread_function, NULL);
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
// 主线程执行回调操作
printf("回调操作执行完毕\n");
pthread_join(thread_id, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
2.2 注意事项
- 条件变量需要与互斥锁一起使用,以确保线程安全。
- 条件变量可以通知一个或多个等待的线程。
3. 使用共享变量
在某些情况下,可以使用共享变量来通知主线程子线程已经完成了任务。
3.1 创建共享变量
#include <pthread.h>
#include <stdio.h>
int shared_var = 0;
void *thread_function(void *arg) {
// 子线程执行任务
shared_var = 1;
return NULL;
}
int main() {
pthread_t thread_id;
pthread_create(&thread_id, NULL, thread_function, NULL);
// 等待子线程完成
while (shared_var == 0) {
// 主线程执行其他任务
}
// 主线程执行回调操作
printf("回调操作执行完毕\n");
pthread_join(thread_id, NULL);
return 0;
}
3.2 注意事项
- 使用共享变量时,需要确保线程安全,避免竞态条件。
- 这种方法适用于任务简单、共享变量变化不频繁的情况。
总结
在C语言中,有多种方法可以实现子线程通知主线程执行回调操作。选择合适的方法取决于具体的应用场景和需求。在实际开发中,需要根据实际情况选择合适的同步机制,以确保程序的正确性和效率。
