【问题标题】:using pthread in C?在C中使用pthread?
【发布时间】:2017-03-31 04:32:47
【问题描述】:

我正在尝试编写一个程序,该程序将持续从监测水位的传感器读取数据。然后在每(10-15 分钟)之后,它需要从其他传感器获取土壤湿度读数。我以前从未使用过 POSIX pthread。到目前为止,这就是我对它如何工作的概念。

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

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);
}

【问题讨论】:

    标签: c multithreading pthreads


    【解决方案1】:

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

    您最终会以某种方式耗尽空间。你有几个选择。

    1. 不要每 10 秒创建一个新线程。通过在 soilMoisture() 函数中创建一个循环来保持线程运行,并取消 funct() — 或至少在其中调用 pthread_create()
    2. 如果必须创建新线程,请将它们分离。您需要使用When pthread_attr_t is not NULL 中概述和链接的函数创建一个非默认的pthread_attr_t

    您还没有处理无数的问题,特别是两个线程之间的同步。如果你没有任何这样的同步,你最好使用两个独立的程序——“每个程序做一项工作但做得很好”的 Unix 口号仍然适用。您将有一个程序来读取土壤湿度,而另一个程序来读取水位。您需要决定数据是存储在数据库中还是以其他方式记录,以及如何记录这些数据。您需要考虑轮换日志。如果传感器离线会发生什么?如何重新启动线程或进程?如何检测线程或进程何时意外锁定或意外退出?等等。

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

    【讨论】:

    • 谢谢,我确实删除了 pthread_create() 并在 soilMoisture() 中添加了一个循环。我最终将需要在两个线程之间进行通信,这就是我不想编写单独的 c 程序的原因。您还提出了我会记住的其他非常好的观点。是的,这只是为了测试目的,我知道 POSIX sleep() 函数是如何工作的。
    猜你喜欢
    • 2011-02-10
    • 2016-03-13
    • 1970-01-01
    • 2014-11-27
    • 2019-07-12
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    相关资源
    最近更新 更多