The OpenNET Project / Index page

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

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

"Shared memory."
Сообщение от All emailИскать по авторуВ закладки on 08-Май-01, 00:21  (MSK)
Если я инициализирую пул для shared memory в родительстком процессе и создаю новый указатель на нее из потомка, то в других потомках этот указатель пустой ( (void *) 0 ). Что я делаю не так, пожскажите пожалуйста.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

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

1. "RE: Shared memory."
Сообщение от XMan Искать по авторуВ закладки on 08-Май-01, 03:01  (MSK)
Так у всех же потомков свои указатели. При создании потомков им передается копия всех данных родителя на момент создания, но каждому в свое адресное простанство. Дальше они работают только с этим адресным пространством.

Если бы ты в родителе инициировал указатель, а потом наделал кучу потомков, то у всех бы был СВОЙ указатель на одну и ту же область памяти. Изменение его одним из потомков никак не влияет на других и на родителя.

Все выше сказанное относится к fork(). Для получения общей памяти для потомков лучше использовать потоки pthread. Они работают в адресном пространстве родителя.

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

2. "RE: Shared memory."
Сообщение от All emailИскать по авторуВ закладки on 08-Май-01, 22:06  (MSK)
Спасибо за ответ, все четко и понятно :)

Еще маленький вопросик, что такое pthread?
(я пробовал почитать man pthread но такого не существует)

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

3. "RE: Shared memory."
Сообщение от XMan Искать по авторуВ закладки on 09-Май-01, 01:18  (MSK)
Ага, значит не я один такой без мана на pthread :))

Все ниже сказанное касается Linux ! Как в других системах - незнаю.

Итак, pthread - это POSIX.1 вариант потоков выполнения (иногда называют нитями, но незнаю насколько это правильно). SUN-овский вариант, кажется, thr или thread. Для работы с потоками определены N функций. В частности, pthread_create и pthread_exit.
int pthread_create(pthread_t *ID, pthread_attr_t *ATTR, void *(*ROUTINE) (void *), void *ARG)
создает поток, используя аттрибуты потока ATTR (NULL - по умолчанию). Потоком является функция void *ROUTINE(void *ARG), которой передается аргумент ARG. В ID возвращается структура, идентифицирующая поток. В книге написано, что в качестве ID можно подставлять NULL.

int pthread_exit(void RET_VAL)
завершение потока. Используется в функции-потоке ROUTINE при завершении работы.

Далее, поскольку все потоки и сам родитель работают с одной областью памяти, то надо как-то разделять доступ, чтобы они друг другу не мешали (например, при записи в одну и ту же переменную). Для этого обычно используется три разновидности блокировок:
1. взаимоисключающая блокировка.
2. условные переменные.
3. семафоры.
Я использовал 1, остальное так и не пригодилось. Для работы с блокировками еть таки функции:
int pthread_mutex_init(pthread_mutex_t *LOCK,pthread_mutexattr_t *ATTR) - инициирует блокировку LOCK (переменная типа pthread_mutex_t). ATTR пока не используется, потому ставят NULL.
int pthread_mutex_destroy(pthread_mutex_t *LOCK) - удаляет блокировку LOCK.
int pthread_mutex_lock(pthread_mutex_t *LOCK) - блокирует остальные потоки.
int pthread_mutex_unlock(pthread_mutex_t *LOCK) - разблокирует остальные потоки.
int pthread_mutex_trylock(pthread_mutex_t *LOCK) - проверяет, можно ли блокировать потоки. Возвращает -1, если кто-то уже блокирует остальных.

Техника блокировок такая. Один поток вызывает ..._lock с аргументом LOCK и продолжает выполнение. В это время еще один поток вызывает ..._lock с агрументом LOCK. При этом до тех пор, пока первый поток не вызовет ..._unlock с аргументом LOCK, этот поток останавливается (нет возврата из функции ..._lock). Таким образом, блокируются не данные, а сам поток. блокировок в программе может быть несколько для более гибкого распределения. например, когда есть 2 блока данных, с каждым из которых работают потоки разных типов, имеет смысл создать 2 блокировки.

Все вышеперечисленные функции имеют тип int, через который обычно возвращается код ошибки (-1).

Это самая что ни на есть основа. Там еще много чего есть. В частности, аттрибуты потока, присоединенные и отсоединенные потоки. Но это лучше посмотреть в книге по программированию под UNIX.

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


Удалить

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




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

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