Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Синхронизация объектов в списке / 3 сообщений из 3, страница 1 из 1
05.02.2007, 14:05
    #34306429
moteus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация объектов в списке
Чуствую что изобретаю велосипед, но ...

Есть список объектов.
И есть множество потоков, которые работают с этими объектами.
Работу пытаюсь организовать таким образом(В качестве объекта синхронизации использую критические секции).

Код: plaintext
1.
2.
TObject *obj = g_lst.Lock("ObjectName");
***
g_lst.Unlock("ObjectName");

Но как организовать удаление этого объекта ни как не пойму.
Удалить безопасно критическую секцию я так понимаю не возможно, так как она потенциально всегда блокирована другим потоком.
Поэтому помещать критическую секцию в объект не возможно.
Если делать отдельный пул критических секций и данамически связывать его с новыми объектами
то возникает задача блокирование блокирования :{ объекта с этим именем и одновременное ожидание пока все потоки вызвавшие Lock для данного объекта не вызовут Unlock.
При этом блокирования работы с другими объектами списка не должно быть.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
//--------- Get CS from pool
void Add(const T& Name, TObject*obj){
  // Get CS from pool
  TCriticalSection*cs = m_pool.pop();
  //Verify valid cs
  ***
  //Assign CS with object name
  m_lock.Add(Name,cs);
}

//-------- Lock Object
TObject* Lock(const T& Name){
 TCriticalSection*cs = m_lock.Get(Name);
 cs->Lock();
 return m_obj.Get(Name);
}

//-------- Unlock Object
void Unlock(const T& Name){
  TCriticalSection*cs = m_head.Get(Name);
  cs->Unlock();
}

//-------- Back CS to pool
void Delete(const T& Name){
  TCriticalSection*cs = m_head.Get(Name);
 // Все потоки вызвавшие Lock(Name) должны завершиться, 
 // а новые должны закончится неудачей.
 //????????????????????????????????????????????????????????????
  
  m_head.Delete(Name);
  //Back CS to pool 
  m_pool.push(cs);
}

Еще я пытался возвращать из Lock указатель на CS тогда в Delete вызов m_head.Delete(Name);
становился безопасным и предотвращал удачный вызов Lock(Name), но как сделать ожидание пока все получившие CS потоки их не освободят я так и не придумал.

Удачи!
...
Рейтинг: 0 / 0
05.02.2007, 14:20
    #34306484
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация объектов в списке
Может в объекте списка?
...
Рейтинг: 0 / 0
05.02.2007, 14:36
    #34306558
moteus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация объектов в списке
Так ведь объекты из списка не знают о синхронизации, а сам список блокировать не правильно.
Я вот щас сделал. Cижу смотрю вроде должно работать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
	
	void Delete(const T& Name){
		TCriticalSection*cs = m_head.Get(Name);
		if(cs){
			cs->Lock();
			m_head.Delete(Name);
			m_obj.Delete(Name);
			m_pool.push(cs);
			cs->Unlock();
		}
	}
	T Lock(const T& Name){
		TCriticalSection*cs = m_head.Get(Name);
		if(!cs)
			throw std::bad_alloc("Object not found");
		cs->Lock();
		TObject *obj = m_obj.Get(Name);
		if(!obj){
			cs->Unlock();
			throw std::bad_alloc("Object not found");
		}
		return obj;
	}

	void Unlock(const T& Name){
		TCriticalSection*cs = m_head.Get(Name);
		if(cs)
			cs->Unlock();
	}
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Синхронизация объектов в списке / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]