Skip to content

Commit 10aabb0

Browse files
committed
add task 2
1 parent 2ad4942 commit 10aabb0

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "helgrind/pthreadpool"]
2+
path = helgrind/pthreadpool
3+
url = https://github.com/trriger/pthreadpool.git

helgrind/README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
Рассмотрим Вкратце что делает `demo.c`:
2+
3+
1. Создаем тредпул с 5-ю тредами
4+
2. Добавляем 50 задач: вывести номер соответствующей задачи.
5+
3. Удаляем тредпул
6+
7+
8+
Для начала проанализируем с помощью helgrind.
9+
10+
11+
Обнаружена гонка данных между 1-м и 3-м потоком. 3-й поток пишет в адрес 0x4A7E058 (это pool->tpool_head) на 31 строчке tpool.c, а на 10 строчке 1-й поток читает оттуда. Этого можно избежать, используя атомики c CAS, сделав join или взяв мьютекст перед тем, как прочитать оттуда.
12+
```
13+
int is_taskover(tpool_t *pool) {
14+
pthread_mutex_lock(&pool->queue_lock);
15+
int result = (pool->tpool_head == NULL);
16+
pthread_mutex_unlock(&pool->queue_lock);
17+
return result;
18+
}
19+
```
20+
21+
Аналогично для 1-го и 2-го потока. 1-й поток пишет в адрес 0x4A7E040 (это pool->shutdown) на 120 строчке tpool.c, а на 20 строчке 2-й поток читает оттуда. Здесь можно загнать pool->shutdown уже под имеющийся лок.
22+
```
23+
pthread_mutex_lock(&pool->queue_lock);
24+
pool->shutdown = 1;
25+
pthread_cond_broadcast(&pool->queue_ready);
26+
pthread_mutex_unlock(&pool->queue_lock);
27+
28+
```
29+
30+
Аналогичные две ошибки выдает ThreadSanitizer.

helgrind/pthreadpool

Submodule pthreadpool added at bf03a96

0 commit comments

Comments
 (0)