在C中使用pthread?

在C中使用pthread?,c,multithreading,pthreads,C,Multithreading,Pthreads,我正试图编写一个程序,不断地从监测水位的传感器读取数据。然后,每隔(10-15分钟)需要从其他传感器获取土壤湿度读数。我以前从未使用过POSIX pthreads。这就是我对它如何工作的概念 它似乎按照我希望的方式工作,但它是实现这一点的正确方式吗。还有什么我需要做的吗 void *soilMoisture(void *vargp) { sleep(10); funct(); return NULL; } int main() { pthread_t pt; int k=1; pt

我正试图编写一个程序,不断地从监测水位的传感器读取数据。然后,每隔(10-15分钟)需要从其他传感器获取土壤湿度读数。我以前从未使用过POSIX pthreads。这就是我对它如何工作的概念

它似乎按照我希望的方式工作,但它是实现这一点的正确方式吗。还有什么我需要做的吗

void *soilMoisture(void *vargp)
{
 sleep(10);
 funct();
 return NULL;
}

int main()
{
 pthread_t pt;
 int k=1;
 pthread_create(&pt, NULL, soilMoisture, NULL);
 while(k>0)
 {
   printf("This is the main thread (Measuring the water level) : %d\n", k);
   sleep(1);
 }
 return 0;
}

void funct()
{
 printf("******(Measuring soil moisture after sleeping for   10SEC)***********\n");
 pthread_t ptk;
 pthread_create(&ptk, NULL, soilMoisture, NULL);
}

不清楚为什么每10秒创建一个新线程,而不是让原来的线程继续。由于原始线程已退出,因此您不会直接累积线程,但不会等待任何线程,因此存在一些未释放的资源。你也不会检查错误,所以你不知道什么时候出了问题;监控将简单地停止

不管怎样,你最终都会耗尽空间。你有两个选择

  • 不要每10秒创建一个新线程。通过在
    soilMoisture()
    函数中创建一个循环来保持线程运行,并取消
    funct()
    -或至少取消其中的
    pthread\u create()
    调用
  • 如果必须创建新线程,请将其分离。您需要使用中概述并链接到的函数创建非默认的
    pthread\u attr\u t
  • 有许多问题您尚未解决,特别是两个线程之间的同步。如果您没有任何这样的同步,最好使用两个单独的程序——Unix的格言“每个程序做一项工作,但做得很好”仍然适用。你有一个程序来读取土壤湿度,另一个程序来读取水位。您需要决定数据是存储在数据库中还是以其他方式记录,以及如何保存此类数据的日志。您需要考虑旋转日志。如果传感器离线,会发生什么情况?如何重新启动线程或进程?如何检测线程或进程何时意外锁定或意外退出?等等


    我假设问题中提到的10-15分钟和代码中的10秒之间的差异是严格用于实际测试的,而不是对POSIX
    sleep()
    函数的误解。

    谢谢,我确实删除了pthread_create(),并在soilMoisture()中添加了一个循环。我最终需要在两个线程之间进行通信,所以我不想编写单独的c程序。你还提出了其他我会记住的非常好的观点。是的,这只是为了测试,我知道POSIX sleep()函数是如何工作的。