Можно ли воспроизводить 2 или более звуковых сигнала (из windows.h) одновременно? Я очень неопытен, когда дело доходит до многопоточности, но разве не следует выполнять работу следующим?
#include <thread>
#include <windows.h>
#include <iostream>
using namespace std;
void operation1();
void operation2();
int main()
{
thread task1 = thread(operation1);
thread task2 = thread(operation2);
task2.join();
task1.join();
return 0;
}
void operation1()
{
Beep(523, 1000);
}
void operation2()
{
Beep(262, 1000);
}
Когда я компилирую и запускаю эту программу, программа воспроизводит только звуковой сигнал с частотой 262 Гц. Означает ли это, что вызывается только операция 2, или эти два звука как-то блокируют друг друга?
Ваш код обнаруживает проблему, которую я вижу очень часто (хотя обычно лучше скрытую), которая приводит к неожиданным результатам и оставляет разработчиков безволосыми. А именно, вы не учитываете время жизни ваших потоков.
Когда вы начинаете новый поток (независимо от того, как, скажем, с помощью C ++ 11 std::thread
) начальный поток продолжает выполняться (в вашем случае, main()
). Если вы не попросите об этом, начальный поток не будет ожидать, что что-то случится с тем, что он только что начал. Он просто движется дальше, и чем main()
возвращает, и по определению это означает, что ваша программа перестает выполняться. Никто не гарантирует вам, что у запущенных вами потоков вообще была возможность выполнить любую операцию!
Вам нужно привыкнуть к ожиданию завершения потоков, прежде чем вернуться из main — например, с помощью thread::join
, На самом деле, C ++ 11 thread
class будет прерывать программу в своем деструкторе, если поток не был либо присоединен, либо отсоединен — но я считаю, что отсоединенные потоки являются плохим выбором дизайна.
Других решений пока нет …