关于数据竞争的一些问题
firma2021 opened this issue · comments
用户的业务逻辑代码可能是千奇百怪、十分复杂的。有可能出现以下两种情况:
两个外部线程调用同一个线程池的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();
}
ok,两点我都在文档说明一下吧。然后我再全面地写一下哪些接口是可以被异步调用的。