# Многопоточность

Здесь описаны операторы и функции для работы с потоками (тип **thread**).

* [Lock()](#lock)
* [resume( thread th )](#resume-thread-th)
* [SetThreadData(obj o)](#setthreaddata-obj-o)
* [sleep( int duration )](#sleep-int-duration)
* [suspend( thread th )](#suspend-thread-th)
* [terminate( thread th )](#terminate-thread-th)
* [ThreadData() obj](#threaddata-obj)
* [Unlock()](#unlock)
* [wait( thread th )](#wait-thread-th)
* [WaitAll()](#waitall)
* [WaitDone()](#waitdone)
* [WaitGroup( int count )](#waitgroup-int-count)

## Операторы

| Оператор            | Результат | Описание               |
| ------------------- | --------- | ---------------------- |
| thread **=** thread |           | Оператор присваивания. |

## Функции

### Lock()

Функция *Lock* блокирует доступ к глобальному ресурсу (мьютексу). Если он уже занят другим потоком, то текущий поток ждет его освобождения. Мьютекс должен быть освобожден с помощью функции *Unlock*.

### resume(thread th)

Функция *resume* продолжает работу потока, который был остановлен функцией *suspend*.

### SetThreadData(obj o)

Функция *SetThreadData* присваивает текущему потоку переменную типа *obj*. Значение переменной может быть получено функцией *ThreadData*.

### sleep(int duration)

Функция *sleep* останавливает выполнение текущего потока на как минимум *duration* миллисекунд.

### suspend(thread th)

Функция *suspend* приостанавливает поток *th*. Используйте функцию *resume* для продолжения работы потока.

### terminate(thread th)

Функция *terminate* прекращает работу потока. Если поток уже завершен, то функция ничего не делает.

### ThreadData() obj

Функция *ThreadData* возвращает объект, который был присвоен текущему потоку. Переменная типа *obj* присваивается потоку функцией *SetThreadData*.

### Unlock()

Функция *Unlock* освобождает доступ к глобальному ресурсу (мьютексу).

### wait(thread th)

Функция *wait* ожидает окончания работы потока *th*. Если поток уже завершен, то функция ничего не делает.

### WaitAll()

Функция *WaitAll* ожидает когда счётчик *WaitGroup* станет равен нулю.

```go
run {
  int count = 3
  WaitGroup(count)
  for i in 1..count {
    go {
      // ...
      WaitDone()
    }
  }
  WaitAll()
}
```

### WaitDone()

Функция *WaitDone* уменьшает счётчик *WaitGroup* на единицу.

### WaitGroup(int count)

Функция *WaitGroup* создает *WaitGroup* счётчик потоков, которые должны завершится вызовом функции *WaitDone*. *count* - начальное значение счётчика.
