Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
%erlang
run([]) ->
ok;
run([F | Others]) ->
spawn(?MODULE, compile, [F]),
run(Others).
system("tar -xv ...");
maxtasks = 32;
bool end = false;
tasks = 0;
while (true) {
char *cmd = next_cmd();
if (next_cmd) {
execve(cmd);
tasks++;
} else {
end = true;
}
if (tasks == max_tasks || end) {
wait(...); // wait for one task to finish
tasks--;
if (end && tasks == 0) break;
}
}
// Поток-runner.
func runner(tasks <-chan string, done chan<- bool) {
// Цикл, ожидающий сообщения
for name := range tasks{
// Компилируем файл.
compile(name)
}
// Посылаем сообщение, что поток завершился.
done <- true
}
for i := 0; i < tests.Len(); i++ {
tasks <- tests.At(i)
}
close(tasks)
var wg sync.WaitGroup
for i := 0; i < *jobs; i++ {
go func(){
for name := range tasks{
compile(name)
}
wg.Done()
}()
wg.Add(1)
}
for i := 0; i < tests.Len(); i++ {
tasks <- tests.At(i)
}
close(tasks)
wg.Wait()
Многопоточное программирование в Go