CodingHanYa / workspace

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

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于数据竞争的一些问题

firma2021 opened this issue · comments

commented

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

两个外部线程调用同一个线程池的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,两点我都在文档说明一下吧。然后我再全面地写一下哪些接口是可以被异步调用的。