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

Здесь описаны операторы и функции для работы с потоками (тип **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* - начальное значение счётчика.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ru.gentee.org/stdlib/threads.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
