Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux pthread_create在完成函数后退出程序_Linux_Gcc_Pthreads - Fatal编程技术网

Linux pthread_create在完成函数后退出程序

Linux pthread_create在完成函数后退出程序,linux,gcc,pthreads,Linux,Gcc,Pthreads,我尝试创建一个程序,在一秒钟内读取大约10次电源读数,并在主程序继续读取读数的同时,每秒钟/分钟启动一个新线程来更新mysql数据库。但在我使用pthread_之后,create函数运行一次,然后程序似乎退出了。这是我第一次尝试用pthread做一些事情,显然我做错了什么。请提供帮助,因为使用新线程更新mysql似乎很明智,所以不会中断主程序。我将添加我的代码(我认为这一点很重要) 职能: void *showreadout(float readout,int l, int s) { pri

我尝试创建一个程序,在一秒钟内读取大约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;
}

还有来自main的东西:


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


问题是,我试图用
pthread_create()
将变量发送到我的函数,它工作了一次,但后来事情似乎变得“一团糟”,或者说程序停止了


我通过为读数设置全局变量来解决这个问题,并在每秒结束后更新它,然后使用
pthread\u create()
调用我的函数并在函数中使用全局变量。我不知道这是否是正确的方法,但它似乎是有效的。

问题是,我试图用
pthread\u create()
将变量发送到我的函数,它工作了一次,但之后事情似乎“出了问题”,或者说程序刚刚停止


我通过为读数设置全局变量来解决这个问题,并在每秒结束后更新它,然后使用
pthread\u create()
调用我的函数并在函数中使用全局变量。我不知道这是否是正确的方法,但它似乎有效。

建议使用
gcc-Wall-Wextra
重建软件并解决问题;请注意,
pthread_create()
需要一个指向启动例程的指针,而不是调用的返回值
gcc-Wall-Wextra
根本不给出任何警告,一切似乎都在检查中。对不起,我有点傻,但是你说的
phtread\u create()
需要指针而不是从调用返回值到底是什么意思,你能举个例子吗(这样我就可以复制粘贴它了)我明白了我想:)。。。在
phtread\u create()之前,我在函数global中使用变量,比如
gsecreadout=secreadout/u在该函数中,我使用全局变量。。。我不知道这是不是正确的方式,但它似乎工作:)。。。感谢您指出这一点,并且每次调用pthread_create时,您的代码都会覆盖线程中的值,使您无法加入较旧的副本。建议使用
gcc-Wall-Wextra
重建软件并解决问题;请注意,
pthread_create()
需要一个指向启动例程的指针,而不是调用的返回值
gcc-Wall-Wextra
根本不给出任何警告,一切似乎都在检查中。对不起,我有点傻,但是你说的
phtread\u create()
需要指针而不是从调用返回值到底是什么意思,你能举个例子吗(这样我就可以复制粘贴它了)我明白了我想:)。。。在
phtread\u create()之前,我在函数global中使用变量,比如
gsecreadout=secreadout/u在该函数中,我使用全局变量。。。我不知道这是不是正确的方式,但它似乎工作:)。。。感谢您指出它,并且每次调用pthread_create时,您的代码都会覆盖线程中的值,使您无法加入旧副本。真正的问题是
showreating(secreadeat/u,u,startsec)
是一个函数调用,而不是函数指针。但由于它返回一个
void*
C,所以允许它。然后pthread_create尝试将空指针作为函数执行?真正的问题是
showreadeat(secreadeat/u,u,startsec)
是函数调用,而不是函数指针。但由于它返回一个
void*
C,所以允许它。然后pthread_create尝试将空指针作为函数执行?