如何在不使用 C++/C 中的阻塞函数的情况下将值从线程返回到主函数
Posted
技术标签:
【中文标题】如何在不使用 C++/C 中的阻塞函数的情况下将值从线程返回到主函数【英文标题】:How to return value from the thread back to main function without using blocking function in C++/C 【发布时间】:2012-12-02 12:09:28 【问题描述】:我正在制作一个路由协议,我需要为每个邻居设置 30 秒的非阻塞计时器,这是我通过线程实现的,这里是示例代码。但是,我检查它的值 2 或 0 以区分线程是超时还是被我停止(我通过设置结构变量的值来停止线程。)
问题是,我的值没有传递回主函数,并且我所知道的唯一解决方案 join 是阻塞的,但我需要非阻塞路由协议。任何帮助将不胜感激。谢谢。
struct arg_struct
int Wait_30sec;
int Alarm_port[5];
int index;
;
void* start_timer(void *arguments)
struct arg_struct *args = (struct arg_struct *)arguments;
int i;
clock_t endwait;
i = args->index;
endwait = clock() + args->Wait_30sec * CLOCKS_PER_SEC;
while (clock() < endwait && args->Alarm_port[i] == 0)
;
if(args -> Alarm_port[i]==0)
args -> Alarm_port[i]=2;
pthread_exit(NULL);
return NULL;
【问题讨论】:
没有 C/C++ 之类的东西 无论你使用什么结构来告诉线程要做什么,都要为线程留出空间来存储结果。 您可能希望使用库进行事件调度,例如libevent。使用它,您可以在一个线程中处理多个套接字和计时器。 【参考方案1】:根据您的代码,值应该反映到主线程,因为您将它的地址传递给线程。我建议像这样调试代码:
1) 首先检查您对线程的调用,并验证您发送的结构变量地址是否正确。然后看看你是否检查了结果的正确变量。
2) 在调用线程之前,您是否设置了结构的index
变量?
3) 可能由于您等待的最终值中存在错误,您的线程没有完成。尝试将当前值和结束值打印到标准输出或文件中,看看循环是否终止。
【讨论】:
感谢您的即时回复。事实上,我已经将 cout 与代码一起使用(代码中未显示),并且我确信我来自 main 函数的值被传递到那里,我也设法通过更改此 Alarm_Port[i] 的值来停止它在主函数中,但我在这个线程中编辑的任何内容都不会反映回来。我试图在网上搜索并出来了,我必须使用阻止的加入,我想避免这种情况。以上是关于如何在不使用 C++/C 中的阻塞函数的情况下将值从线程返回到主函数的主要内容,如果未能解决你的问题,请参考以下文章