コード例 #1
0
ファイル: task_queue.cpp プロジェクト: Drru97/tdesktop
void TaskQueue::TaskThreadPool::AddQueueTask(TaskQueue *queue, Task &&task) {
	QMutexLocker lock(&queues_mutex_);

	queue->tasks_.push_back(new Task(std_::move(task)));
	auto list_was_empty = queue_list_.Empty(kAllQueuesList);
	auto threads_count = threads_.size();
	auto all_threads_processing = (threads_count == tasks_in_process_);
	auto some_threads_are_vacant = !all_threads_processing && list_was_empty;
	auto will_create_thread = !some_threads_are_vacant && (threads_count < MaxThreadsCount);

	if (!queue->SerialTaskInProcess()) {
		if (!queue_list_.IsInList(queue)) {
			queue_list_.Register(queue);
		}
	}
	if (will_create_thread) {
		threads_.push_back(MakeThread([this]() {
			ThreadFunction();
		}));
		threads_.back()->start();
	} else if (some_threads_are_vacant) {
		t_assert(threads_count > tasks_in_process_);
		thread_condition_.wakeOne();
	}
}
// Default Run implementation
int Thread::Run()
{
	if (!ThreadFunction)
		return 0;

	int ret = ThreadFunction(this, UserHandle);

	return ret;
}
コード例 #3
0
ファイル: OVR_ThreadsPthread.cpp プロジェクト: w732/LibOVR-2
// Default Run implementation
int    Thread::Run()
{
    // Call pointer to function, if available.    
    return (ThreadFunction) ? ThreadFunction(this, UserHandle) : 0;
}