如何在不使用 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 中的阻塞函数的情况下将值从线程返回到主函数的主要内容,如果未能解决你的问题,请参考以下文章

c#在不退出子线程的情况下将值从子线程传递给父线程

如何在不使用向量的情况下将数组传递给函数?

如何在不刷新页面的情况下将值从 jsp 页面发送到数据库

在不循环的情况下将值更新到数据集中列中的整行

在不知道数据类型的情况下将值绑定到 PreparedStatement

如何以非阻塞方式链接期货?也就是说,如何在不阻塞的情况下将一个future用作另一个future的输入?