Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2014, 17:08   #1
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию синхронизация потоков

Привет всем!

Помогите освоится с std::condition_variable. Применить хочу к нижеизложенной задаче.Не до конца пойму как это работает.

Есть таски(асинхронны к GUI потоку), которые выполняются каждый в отдельном потоке. Нужно чтобы эти таски выполнялись последовательно. Т.е. при создании таска они начинали ждать завершения уже выполняющегося таска. Тут все просто. Ставлю обычный мюткекс в начале функции таски и у меня все окей. Но хочу добавить возможность отмены таска. Т.е. чтобы с GUI можно было его cancel-ьнуть. Как это сделать в рамках одной функции? ниже приведен приблизительный код.

Код:

#include <condition_variable>
#include <iostream>
#include <random>
#include <thread>
#include <mutex>
#include <queue>

static std::condition_variable	cancel_check_;
static std::mutex				run_mutex_;
static std::mutex				state_mutex;

bool cancel = false;
bool converting = false;

bool condition_func()
{
	std::lock_guard<std::mutex> guard(state_mutex);

	if (cancel)
		return true;

	if (!converting)
	{
		converting = true;
		return true;
	}

	return false;
}

void task()
{
	std::cout << "task id=" << std::this_thread::get_id() << std::endl;

	std::unique_lock<std::mutex> locker(run_mutex_);
	
	std::cout << "before wait id=" << std::this_thread::get_id() << std::endl;
	cancel_check_.wait(locker, condition_func);
	
	if (cancel)
	{
		return ;
	}
	
	std::cout << "working id=" << std::this_thread::get_id() << std::endl;
	std::this_thread::sleep_for(std::chrono::seconds(4));


	converting = false;

	std::cout << "completed id=" << std::this_thread::get_id() << std::endl;
	//locker.unlock();
	cancel_check_.notify_one();
}

void cancel_func()
{
	std::cout << "cancel" << std::endl;

	cancel = true;
	cancel_check_.notify_all();

	std::cout << "notify_all complteted" << std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
	std::thread first_run(task);
	std::thread next_run(task);
	std::thread third_run(task);

	std::this_thread::sleep_for(std::chrono::seconds(1));

	//std::thread cancel_thread(cancel_func);


	//cancel_thread.join();
	first_run.join();
	next_run.join();
	third_run.join();
	
	return 0;
}
Получается что 2ой и 3ий потоки ждут на
std::unique_lock<std::mutex> locker(run_mutex_);
как изменить код чтобы они ждали на
cancel_check_.wait(locker, condition_func); ?
Diego__ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизация потоков Fireblade-fan Общие вопросы Delphi 5 17.12.2012 01:57
Синхронизация потоков _Bers Общие вопросы C/C++ 5 23.12.2011 22:57
Синхронизация потоков добрый_фей Помощь студентам 5 09.12.2011 19:57
синхронизация потоков m_kostik Win Api 0 26.03.2010 23:56