многопоточность — играть несколько звуковых сигналов одновременно через многопоточность?

Можно ли воспроизводить 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, или эти два звука как-то блокируют друг друга?

0

Решение

Ваш код обнаруживает проблему, которую я вижу очень часто (хотя обычно лучше скрытую), которая приводит к неожиданным результатам и оставляет разработчиков безволосыми. А именно, вы не учитываете время жизни ваших потоков.

Когда вы начинаете новый поток (независимо от того, как, скажем, с помощью C ++ 11 std::thread) начальный поток продолжает выполняться (в вашем случае, main()). Если вы не попросите об этом, начальный поток не будет ожидать, что что-то случится с тем, что он только что начал. Он просто движется дальше, и чем main() возвращает, и по определению это означает, что ваша программа перестает выполняться. Никто не гарантирует вам, что у запущенных вами потоков вообще была возможность выполнить любую операцию!

Вам нужно привыкнуть к ожиданию завершения потоков, прежде чем вернуться из main — например, с помощью thread::join, На самом деле, C ++ 11 thread class будет прерывать программу в своем деструкторе, если поток не был либо присоединен, либо отсоединен — ​​но я считаю, что отсоединенные потоки являются плохим выбором дизайна.

1

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

Других решений пока нет …