CodingHanYa / workspace

workspace是基于C++11的轻量级异步执行框架,支持:通用任务异步并发执行、优先级任务调度、自适应动态线程池、高效静态线程池、异常处理机制等。
Apache License 2.0
916 stars 136 forks source link

关于数据竞争的一些问题 #5

Closed firma2021 closed 1 year ago

firma2021 commented 1 year ago

用户的业务逻辑代码可能是千奇百怪、十分复杂的。有可能出现以下两种情况:

两个外部线程调用同一个线程池的waitForTasks()函数,此时会造成数据竞争,程序崩溃。 用户业务逻辑复杂的时候,我认为有可能需要这种用法。

用户向线程池提交了一个函数,这个函数中又去调用线程池的waitForTasks(),此时程序会永远阻塞。 这种用法或许有点儿愚蠢,,但至少您应该在文档中写明waitForTasks()不能提交给线程池执行。 用户代码量大的时候可能难以发现这个错误。线程池应该能检测出这种错误并提示用户。

#include "../hipe.h"

using namespace hipe;

void multithread_wait_task()
{
    DynamicThreadPond pond (8);

    pond.submit([](){std::cout << "hello world!" << std::endl;});

    std::thread trd { [&pond](){ pond.waitForTasks(); } };
    pond.waitForTasks();
}

void poolthread_wait_task()
{
    DynamicThreadPond pond (8);
    pond.submit([&pond](){pond.waitForTasks(); });
    pond.waitForTasks();
}

int main()
{
    multithread_wait_task();
    poolthread_wait_task();
}
CodingHanYa commented 1 year ago

ok,两点我都在文档说明一下吧。然后我再全面地写一下哪些接口是可以被异步调用的。