【发布时间】: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 时都会覆盖线程中的值,让您无法加入旧副本。