Мне сложно сконструировать основной рабочий процесс моего приложения, используя потоки и сигналы.C++, сигнал и потоки
Моя цель - иметь основной поток, сигналы отвлечения и другие темы, периодически делающие материал (фактически используя датчики на малине pi и сохраняя извлеченные данные). Мне нужна возможность закрыть программу чистым способом, т. Е. Дождаться, что датчик закончит запись данных (если они есть, когда сигнал возникнет) перед закрытием. Я использую C++ 11.
На данный момент, у меня есть такой пример:
#include <iostream>
#include <thread>
#include <csignal>
#include <mutex>
#define NUM_THREAD 3;
static volatile int stop = 0; // If the threads needs to stop
std::mutex m; // Mutex
void threadHandle(int tid) {
while(1) {
std::cout << "Launched by thread " << tid << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "I have sleep well " << tid << std::endl;
m.lock();
if(stop) {
std::cout << "Thread " << tid << " needs to stop" << std::endl;
m.unlock();
break;
}
m.unlock();
}
}
void signalHandler(int signum) {
m.lock();
std::cout << "Signal " << signum << " received" << std::endl;
stop = 1;
m.unlock();
}
int main() {
std::thread t[NUM_THREAD];
std::signal(SIGINT, signalHandler);
//Launch a group of threads
for (int i = 0; i < NUM_THREAD; i++) {
t[i] = std::thread(call_from_thread, i);
}
std::cout << "Launched from the main\n";
for (int i = 0; i < NUM_THREAD; i++) {
t[i].join();
}
return 0;
}
Моя остановка значение летуч только потому, что я использую его внутри обработчика сигнала. Должен ли я использовать std :: atomic_int для обеспечения атомных вызовов значения моего сигнала? Действительно ли мьютекс необходим? Или, в более общем плане, это хороший способ добиться того, чего я хочу?
Еще одна проблема, которую я мог бы иметь, заключается в том, что некоторые датчики могут иметь время ожидания между очень длинными измерениями (например, 2 или 3 часа), поэтому мне нужно будет проверить значение остановки каждые 2 или 3 секунды .. и это не похоже на чистый способ сделать это. Другое решение, отправляющее сигналы в потоки, позволяет мне просто заставить мой поток «спать»; но снова у меня нет элементов управления, чтобы сообщить потоку завершить его действие до завершения.
Заранее благодарен!
Спасибо за четкий ответ! – Vuzi