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