背景
芯片a和芯片b串口通信,a发送命令给b,b回复响应给a;b偶尔会主动发送事件消息给a
分析
当b不需要主动发消息给a时,a串口发送,再等消息就行了
现在考虑到b会主动发,需要一个单独的线程,专门用于接收串口消息
发送线程:发命令,等待
接收线程:接收,判断为命令回复,通知到发送线程
需要用到 条件变量和互斥锁
线程间通信,一个线程需要等另一个线程的某个条件满足后,继续运行
具体实现原理还不理解,先用起来,了解下基本用法,见下面例子
例子
先不管串口通信的问题,看一个使用条件变量和互斥锁的示例程序
一个进程,创建2个线程,detach运行,然后主进程sleep
线程a打印,等待 条件变量,等到条件后,再打印
线程b接收键盘输入,当输入为continue,通知线程a继续打印
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
// 全局变量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int condition_met = 0; // 条件标志
// 线程A函数:打印,等待条件变量,然后再打印
void* thread_a(void* arg) {
pthread_mutex_lock(&mutex);
printf("%s start, then wait......\n", __func__);
fflush(stdout);
// 等待条件变量
while (!condition_met) {
pthread_cond_wait(&cond, &mutex);
}
printf("%s wait condition met, go on run\n", __func__);
fflush(stdout);
pthread_mutex_unlock(&mutex);
return NULL;
}
// 线程B函数:接收键盘输入,当输入为"continue"时通知线程A
void* thread_b(void* arg) {
char input[100];
printf("线程B:请输入命令(输入'continue'唤醒线程A):\n");
while (1) {
if (fgets(input, sizeof(input), stdin) != NULL) {
// 去除换行符
input[strcspn(input, "\n")] = '\0';
if (strcmp(input, "continue") == 0) {
pthread_mutex_lock(&mutex);
condition_met = 1;
printf("线程B:收到continue命令,唤醒线程A\n");
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
break;
} else {
printf("线程B:无效命令,请输入'continue'\n");
}
}
}
return NULL;
}
int main() {
pthread_t tid_a, tid_b;
int ret;
printf("主进程开始\n");
// 创建线程A
ret = pthread_create(&tid_a, NULL, thread_a, NULL);
if (ret != 0) {
fprintf(stderr, "创建线程A失败\n");
exit(1);
}
// 创建线程B
ret = pthread_create(&tid_b, NULL, thread_b, NULL);
if (ret != 0) {
fprintf(stderr, "创建线程B失败\n");
exit(1);
}
// 分离线程
pthread_detach(tid_a);
pthread_detach(tid_b);
printf("主进程:线程已创建并分离,现在sleep 10秒\n");
// 主进程sleep
sleep(10);
printf("主进程结束\n");
// 清理资源
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
编译运行 ,输出
//编译
gcc -o cond_example test_cond_var_mutex.c -lpthread
//运行
./cond_example
//输出
主进程开始
thread_a start, then wait......
线程B:请输入命令(输入'continue'唤醒线程A):
主进程:线程已创建并分离,现在sleep 10秒
continue
线程B:收到continue命令,唤醒线程A
thread_a wait condition met, go on run
主进程结束
710

被折叠的 条评论
为什么被折叠?



