【问题标题】:pthread_create exits the program after finishing functionpthread_create 完成函数后退出程序
【发布时间】:2020-07-07 12:30:33
【问题描述】:

我尝试创建一个程序,该程序在一秒钟内读取大约 10 次电源读数,并在主程序继续读取读数时每秒/分钟启动一个新线程以更新 mysql 数据库。但是在我使用 pthread_create 函数运行一次之后,程序似乎退出了。这是我第一次尝试用 pthread 做某事,显然我做错了什么。请帮忙,因为使用新线程更新mysql似乎很聪明,所以它不会中断主程序。我将添加我的代码(我认为这很重要)

功能:

void *showreadout(float readout,int l, int s) {
  printf("readout: %f loops: %i sec: %i\n",readout,l,s);
  return NULL;
}

和主要的东西:


      pthread_t thread;
      int p = 0, startminute = currentminute(),startsec,u;
      float secreadout;

      while (startminute == currentminute()) {
        startsec = currentsec();
        u = 0;
        secreadout = 0;
        while (startsec == currentsec()) {
          secreadout += doloop(pinnumber);
          u++;
        }
        pthread_create(&thread, NULL, showreadout(secreadout/u,u, startsec), NULL);
        p++;
      }

【问题讨论】:

  • 建议使用gcc -Wall -Wextra 重建您的软件并解决问题;请注意,pthread_create() 需要一个指向启动例程的指针,而不是调用的返回值
  • gcc -Wall -Wextra 根本没有发出任何警告,一切似乎都在检查之中。抱歉有点傻,但你的意思是什么phtread_create()需要指针而不是调用返回值,你能举个例子吗(这样我就可以复制粘贴它)
  • 我想通了,我想 :) ...在phtread_create() 之前,我创建了我在函数中使用的变量,比如gsecreadout = secreadout/u;,在那个函数中我使用了全局变量...我不知道是这是正确的方式,但它似乎工作:) ...谢谢你指出它
  • 而且您的代码每次调用 pthread_create 时都会覆盖线程中的值,让您无法加入旧副本。

标签: linux gcc pthreads


【解决方案1】:

问题是我试图将带有pthread_create() 的变量发送到我的函数并且它工作了一次,但后来事情似乎“抬头”或者程序刚刚停止。

我通过为读数创建全局变量并在每秒结束后更新它来解决它,然后使用pthread_create() 调用我的函数并在我的函数中使用全局变量。我不知道这是处理它的正确方法,但它似乎有效。

【讨论】:

  • 真正的问题是showreadout(secreadout/u,u, startsec)是一个函数调用,而不是函数指针。但由于它返回 void* C 允许它。然后 pthread_create 尝试将 NULL 指针作为函数执行?