The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Тематический каталог: Многопотоковое программирование под Li..."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Тематический каталог: Многопотоковое программирование под Li..."  +/
Сообщение от auto_topic on 07-Апр-05, 12:19 
Обсуждение статьи тематического каталога: Многопотоковое программирование под Linux (threads linux gcc)

Ссылка на текст статьи: http://www.opennet.ru/base/dev/linux_threads.txt.html

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Многопотоковое программирование под Linux (threads linux gcc)"  +/
Сообщение от script email on 07-Апр-05, 12:19 
sleep использовать не всегда хорошо. Есть более оптимальные решения. Например просыпаться в этом месте по сигналу.
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "Многопотоковое программирование под Linux (threads linux gcc)"  +/
Сообщение от MordorSV email on 11-Янв-09, 14:40 
У автора есть грубая ошибка!
в main создан указатель
>>DATA *arg;

позднее он в цикле инициализируется объектом (тоже в main)
>> arg = new DATA;

но удаляется объект почемуто из функций потоков
>> delete a; // удаляем свои данные

причем удаление происходит После разблокирования мутекса!

Так делать очень опасно!
можете легко прибить чужой объект или вычитать чужие данные (чтение тоже выполняется вне лока мутекса почемуто)

Безопасные варианты:
1) создать массив указателей
DATA *arg[SIZE_I][SIZE_J]
и отдавать каждому потоку указатель на индивидуальный кусок памяти.
2)выполнять все операции с общей памятью только при заблокированном мутексе (тоесть в потоках чтение, модификация и освобождение общей памяти должно быть внутри общего pthread_mutex_lock(&lock)).
3) удалять объекты только в том потоке который их создал.

Код статьи в качестве примера использовать не рекомендуется ибо в нем автор наступил на те грабли от которых по идее должен уберечь читателей.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "Многопотоковое программирование под Linux (threads linux gcc)"  +/
Сообщение от Romzzzec on 14-Сен-10, 12:48 
>>//создаем поток для ввода
>>pthread_create(&thr[i+z], NULL, input_thr, (void *)arg);

как я понял должны создаваться потоки для ввода каждого элемента матрицы, но
i=1,z=2 -- &thr[i+z] укажет на &thr[3]
i=2,z=1 -- &thr[i+z] укажет на &thr[3]

>>//Ожидаем завершения всех потоков
>>//идентификаторы потоков хранятся в массиве
>>pthread_join(thr[i], NULL);

при
i=3,z=3 -- &thr[i+z] укажет на &thr[6] и этот поток мы не ждем, т.к. size_i=4, правильно? соответственно и расчет данных для таких элементов будет "левым"?

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

4. "Многопотоковое программирование под Linux (threads linux gcc)"  +/
Сообщение от mamon email on 27-Сен-10, 12:04 
Действительно имеет место несколько косяков.
1) При определении массива thr надо указывать количество элементов как SIZE_I*SIZE_J.
2) В циклах обращаться к элементам как i*SIZE_J+z
3) При переборе элементов массива соответственно должно быть написано for(int i = 0; i<SIZE_I*SIZE_J; ++i)
4) Как уже написал MordorSV действительно лучше создать массив указателей на данные и удалять его в том потоке в котором создавался
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру