gpt4 book ai didi

c - pthread 中是否可能有一个无限循环?

转载 作者:太空宇宙 更新时间:2023-11-04 08:47:38 24 4
gpt4 key购买 nike

我正在用 pthreads 做一个项目,我不能再进一步了。我有 3 个线程,一个线程应通过 I2C (SMBUS) 读取一些传感器值,一个线程应使用第一个线程提供的数据进行计算,最后一个线程应在屏幕上打印数据。互斥锁负责线程之间的同步。我如何在线程中使用无限 while 循环,因为我的线程不只是“完成工作并完成”?它们将永远持续下去(或直到按下 Ctrl+C 键)。

我应该把 pthread_join 函数放在哪里?

我的第一种方法如下,但它无法正常工作:

感谢您的帮助。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <linux/i2c-dev.h>
#include <fcntl.h>

typedef struct vector {
double x;
double y;
double z;
} vector_t;

typedef struct all_vectors {
vector_t *gyro;
vector_t *accel;
vector_t *magnet;
} vectors_t;

vectors_t *vectors;

pthread_t th1, th2, th3;
pthread_mutex_t mutex;

int main()
{
initSensors(); //defined in another .c file

pthread_mutex_init(&mutex, NULL);
pthread_create(&th1, NULL, (void *) &readSensors, (void *) vectors);
pthread_create(&th2, NULL, (void *) &calculateAngle, NULL);
pthread_create(&th3, NULL, (void *) &printData, NULL);


while(1)
{
sleep(1);
}

/* The program never reaches the following codes ? */
pthread_mutex_destroy(&mutex);
pthread_exit(NULL);
}


void readSensors(void *vectors)
{
vectors_t *vecs = (vectors_t *)vectors;

while(1)
{
pthread_mutex_trylock(&mutex);
readGyro(vecs->gyro); //defined in another .c file
readAccel(vecs->accel); //defined in another .c file
readMagnet(vecs->magnet); //defined in another .c file
pthread_mutex_unlock(&mutex);
}

pthread_exit(NULL);
}


void calculateAngle()
{
while(1)
{
pthread_mutex_trylock(&mutex);

doSomeCalculation(vectors); //defined in another .c file

pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}

void printData()
{

while(1)
{
pthread_mutex_trylock(&mutex);

printf("%lf, %lf, %lf, lf, %lf, %lf, lf, %lf, %lf", \
vectors->accel->x, vectors->accel->y, vectors->accel->z, \
vectors->gyro->x, vectors->gyro->y, vectors->gyro->z, \
vectors->magnet->x, vectors->magnet->y, vectors->magnet->z );
pthread_mutex_unlock(&mutex);

fflush(stdout);
}

pthread_exit(NULL);
}

最佳答案

你似乎对这个无限循环之后的代码感到惊讶

 while(1)
{
sleep(1);
}

未执行。即使代码能到这一行

pthread_mutex_destroy(&mutex);

你会遇到问题,因为线程仍在使用互斥锁。如果你想优雅地关闭你的代码,我会添加一个全局 bool 值,你在你的线程中循环 true ,然后添加一个 SIGINT 处理程序将它设置为 false 以便线程可以退出。然后在 main 中,删除无限 while 循环并在每个线程上调用 pthread_join,然后最终销毁互斥量并最终退出 main()

pthread_join 调用将阻塞直到线程退出,因此不需要 main() 循环。线程将在 SIGINT 上正常退出,程序应该以干净的方式运行和终止。

最后一个观察:由于 vectors 是一个全局变量,您不需要通过 void* 参数将它传递给线程,因为它已经可见。

关于c - pthread 中是否可能有一个无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21033815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com