The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"RE: Блокировка (pthread_mutex_lock)"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"RE: Блокировка (pthread_mutex_lock)"
Сообщение от NL Искать по авторуВ закладки on 03-Дек-02, 22:07  (MSK)
суть в следующем: есть прога которая создает 3 птока
1-принимает запросы
2-обрабатывает запросы
3-пишет данные в файл.
второй поток в зависимости от нагрузки может плодится (точнее первый поток плодит вторые). потоки передают друг другу данные через буферы. на каждый буфер есть флаг 1-буфер занят каким-либо потоком 0-буфер свободен. в принципе одновременный доступ двух и более потоков к одному буферу исключен. НО при большой назрузке растет вероятность того, что два потока могут одновременно обратиться к флагу, после чего прога благополучно может рухнуть.
Так вот вопрос: 1:есть ли какая либо функция которая может закрыть всем потокам кроме вызываюшего доступ к определенным данным ? (ну скажем передаю адрес и размер массива и он блокиреутся для других) 2: в описании на pthread_mutex_lock написано, что он блокирует исключающий семафор. что это за хрень я так и не врубился. попробывал опытным путем и эта функция заблокировала мне вызывающий ее поток, а такая фигня меня не устраивает. можно ли этой функцией заблокировать все потоки кроме вызывающего и как ?? 3: если у кого нибудь была подобная проблема, расскажите как ее решили?(если не секрет)
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

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

1. "RE: Блокировка (pthread_mutex_lock)"
Сообщение от XMan Искать по авторуВ закладки on 04-Дек-02, 00:44  (MSK)
Интересно, как же ты блокировки использовал ? Сказал бы что ли в вопросе...
Ну да ладно. Если я правильно все помню, то что-то типа такого:
---

pthread_mutex_t lochka

void * potok(void * arguments)
{
  ...
  if (! pthread_mutex_lock(&lochka)) {
    // Лочка прошла. Можно делать всякую фигню
    ...
    pthread_mutex_unlock(&lochka);
  } else {
    // Залочить не получилось
    ...
    pthread_mutex_unlock(&lochka);
  }
  ...
  pthread_exit(NULL);
}

main ()
{
  ...
  pthread_mutex_init(&lochka,NULL);
  ...
  // Создаем поток
  if (! pthread_mutex_create(0,0,potok,arguments))
    perror("pthread_create");
  ...
  if (pthread_mutex_destroy(&lochka))
    perror("pthread_mutex_destroy");
  ...
}

---
должно работать. У меня когда-то работала програмка с потоками без всяких проблем.
Только учти - блокируется не "доступ к определенным данным", а выполнение потока, пытающегося сделать mutex_lock на заблокированную лочку, до тех пор, пока другой поток (который ее заблокировал) не скажет mutex_unlock.

PS. Код написан под linux (типа, стандарт POSIX).

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




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

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