Есть ли способ заставить функцию выполнять свой код в течение определенного времени, затем приостановить выполнение и перейти к другой функции. Я хочу быть в состоянии сделать программу, которая может работать в многозадачном режиме. Я уже пытался использовать <thread>
, но всякий раз, когда я пытаюсь запустить программу, она частично запускает один из потоков, а затем отладчик выдает «сигнал SIGABRT» и останавливается. Есть ли другой способ сделать это?
Редактировать:
Вот код, который я пытался использовать темы. Я сделал это в качестве теста, чтобы попытаться запустить две функции одновременно, а затем добавить таймер, чтобы приостановить выполнение. Я хочу, чтобы он мог запускать один поток в течение короткого времени, затем переходить к другому потоку и продолжать это делать.
#include <iostream>
#include <thread>
using namespace std;
void task1()
{
for (int i=0; i<100; i++)
{
cout << i << '\n';
}
}
void task2()
{
for (int i=0; i<100; i++)
{
cout << i << '\n';
}
}
int main()
{
thread t1(task1);
thread t2(task2);
return 0;
}
Наиболее часто используемый способ сделать это без многопоточности — это использовать цикл обработки сообщений, используемый большинством каркасов GUI. Немного работы сделано в for
цикл, а затем PumpMessages
или все, что вызывается, чтобы поддерживать отзывчивость графического интерфейса путем обработки сообщений в очереди, а затем выполняется дополнительная работа.
На мой взгляд, это плохая практика. На самом деле это приводит к противоречивым, медленным и не отвечающим требованиям приложениям.
Другим вариантом могут быть возобновляемые функции, такие как те, что доступны в C # и предлагается для C ++ 17. Однако они не будут доступны в данный момент.
Правильно настроить многопоточность сложно, поскольку вы уже обнаружили сбои и ошибки синхронизации являются общими и могут быть обнаружены только во время выполнения. Однако многоядерные процессоры сейчас являются стандартом везде, и вы не можете избежать многопоточности, поэтому лучше узнать, как это сделать правильно.