Рассмотрим этот контекст:
Наличие группы потоков, выполняющих некоторую работу (работа в бесконечном цикле, внедренный проект), где количество потоков (и некоторых параметров) зависит от результата базы данных.
Мне нужно удалить или создать потоки из этой группы, когда есть изменения в базе данных.
Вот код:
for (result::const_iterator pin = pinesBBB.begin(); pin != pinesBBB.end(); ++pin)
{
string pinStr = pin["pin"].as<string>();
boost::thread hiloNuevo(bind(WorkPin, pinStr));
Worker.add_thread(&hiloNuevo);
}
Где result
pqxx::result
из библиотеки pqxx.
Этот фрагмент кода выполняет итерацию таблицы из результата SQL-запроса и создает поток для каждой найденной записи.
После этого есть этот код, который проверяет одну и ту же таблицу каждые пару минут:
'
void ThreadWorker(boost::thread_group *worker, string *pinesLocales)
{
int threadsVivosInt = worker->size();
string *pinesDB;
int contador;
for (;;)
{
contador = 0;
sleep(60);
try
{
result pinesBBB = TraerPines();
for (result::const_iterator pin = pinesBBB.begin(); pin != pinesBBB.end(); ++pin)
{
pinesDB[contador] = pin["pin"].as<string>();
contador++;
}
thread hiloMuerto
}
catch (...)
{
sleep(360);
}
}
}
'
Я хочу сделать доступ к этому worker
thread_group и удалить один из этих потоков.
Я пробовал использовать индекс Int как worker[0]
и с идентификатором boost::thread::id
Я могу удалить поток с помощью native_handle
а затем использовать такую форму, как pthread_cancel
но я не могу получить поток из группы потоков.
Есть идеи? Благодарю!
boost :: thread_group :: remove_thread() удаляет указанный поток из заданного потока_группы. Как только вы это сделаете, вы теперь отвечаете за управление потоком.