powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Синхронизация объектов в списке
3 сообщений из 3, страница 1 из 1
Синхронизация объектов в списке
    #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
Синхронизация объектов в списке
    #34306484
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может в объекте списка?
...
Рейтинг: 0 / 0
Синхронизация объектов в списке
    #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
3 сообщений из 3, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Синхронизация объектов в списке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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