[Paralelismo] Multi Threading - UnbDroid/SEK GitHub Wiki

O que é?

Multithreading é a capacidade que o sistema operacional possui de executar várias threads simultaneamente sem que uma interfira na outra. Estas threads compartilham os recursos do processo, mas são capazes de ser executadas de forma independente.

Como o NXT suporta Multi-Threading, uma tarefa no NXC corresponde diretamente a uma Thread. As tarefas são definidas usando a palavra-chave task com a sintaxe mostrada no exemplo de código abaixo.

task name() {
  codigo
}

O nome da task pode ser qualquer identificador legal. Um programa deve sempre ter pelo menos uma tarefa. O corpo de uma tarefa, assim como a de uma função, consiste em uma lista de instruções.

Você pode iniciar e interromper tarefas com as instruções start e stop. No entanto, o principal mecanismo para iniciar tarefas dependentes é agendá-las com a função Precedes ou a função Follows da API.

A função da API StopAllTasks interrompe todas as tarefas atualmente em execução. Você também pode interromper todas as tarefas usando a função Stop. Uma tarefa se interromperá simplesmente alcançando o final de seu corpo.

Exemplo:

task music() {
  while (true) {
    PlayTone(TONE_A4, MS_500);
    Wait(MS_600);
  }
}

task movement() {
  while (true) {
    OnFwd(OUT_A, Random(100));
    Wait(Random(SEC_1));
  }
}

task main() {
  Precedes(music, movement);
}

Motivação

Muitas vezes queremos executar tarefas contínuas ao mesmo tempo. Por exemplo, queremos fazer leituras com o sensor de cor a todo momento ao mesmo tempo em que estamos nos movimentando. Para isso precisamos dividir as tarefas em tasks. Deixando que o processador cuide do tratamento delas simultaneamente.

Cuidados

  • Ao executar motores em tasks, cuidado para não executar duas tasks diferentes. Por exemplo, uma de ir pra frente e outra de virar. Isso vai travar seu robô.
  • Tasks podem ser bastante úteis, no entanto, elas devem ser bem utilizadas, caso contrário pode spbrecarregar o processador.
  • As funções Precedes e Follows tem que ser chamadas dentro de uma task. As instruções start e stop não necessariamente.