Время выполнения функции предела

Есть ли способ заставить функцию выполнять свой код в течение определенного времени, затем приостановить выполнение и перейти к другой функции. Я хочу быть в состоянии сделать программу, которая может работать в многозадачном режиме. Я уже пытался использовать <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;
}

0

Решение

Наиболее часто используемый способ сделать это без многопоточности — это использовать цикл обработки сообщений, используемый большинством каркасов GUI. Немного работы сделано в for цикл, а затем PumpMessages или все, что вызывается, чтобы поддерживать отзывчивость графического интерфейса путем обработки сообщений в очереди, а затем выполняется дополнительная работа.

На мой взгляд, это плохая практика. На самом деле это приводит к противоречивым, медленным и не отвечающим требованиям приложениям.

Другим вариантом могут быть возобновляемые функции, такие как те, что доступны в C # и предлагается для C ++ 17. Однако они не будут доступны в данный момент.

Правильно настроить многопоточность сложно, поскольку вы уже обнаружили сбои и ошибки синхронизации являются общими и могут быть обнаружены только во время выполнения. Однако многоядерные процессоры сейчас являются стандартом везде, и вы не можете избежать многопоточности, поэтому лучше узнать, как это сделать правильно.

1

Другие решения


По вопросам рекламы [email protected]