在Linux中,线程内异步通知通常涉及到信号(signals)和条件变量(condition variables)的使用。
基础概念:
相关优势:
类型:
应用场景:
问题与解决方法:
问题:线程在等待信号或条件变量时可能会发生忙等(busy-waiting),这会浪费CPU资源。
解决方法:
sigwait()
或pthread_cond_wait()
等函数,这些函数会让线程在等待时进入休眠状态,从而避免忙等。sigaction()
来设置信号处理函数,而不是使用signal()
,因为sigaction()
提供了更多的控制和可移植性。示例代码(使用条件变量):
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int ready = 0;
void* producer(void* arg) {
// ... 生产数据 ...
pthread_mutex_lock(&mutex);
ready = 1;
pthread_cond_signal(&cond); // 通知消费者
pthread_mutex_unlock(&mutex);
return NULL;
}
void* consumer(void* arg) {
pthread_mutex_lock(&mutex);
while (!ready) {
pthread_cond_wait(&cond, &mutex); // 等待生产者通知
}
// ... 消费数据 ...
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t prod, cons;
pthread_create(&prod, NULL, producer, NULL);
pthread_create(&cons, NULL, consumer, NULL);
pthread_join(prod, NULL);
pthread_join(cons, NULL);
return 0;
}
在这个示例中,生产者线程生产数据后,通过条件变量通知消费者线程。消费者线程在等待条件变量时,会释放互斥锁并进入休眠状态,从而避免忙等。
领取专属 10元无门槛券
手把手带您无忧上云