• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Помогите разобраться с чтением/записью из потоков в .net

  • Автор темы softmaker
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

softmaker

Реализуйте 'синхронное' cвойство SharedRes типа string .

То есть свойство, самостоятельно заботящиеся о том, чтобы одновременно-обращающиеся к нему потоки работали с ним корректно.
Правила такого обращения следуюшие:

1. Записывать в одно время может только один поток, любой следующий 'писатель' должен ждать(блокироваться).
2. Если один поток выполняет запись, то любой читатель должен ждать завершения
этой записи.
3. Пока происходит чтение свойства запись невозможна.
Однако требуется избежать такой ситуации , когда запись невозможна из-за сменяющих друг друга операций чтения.
Любое количнеств читающих потоков могут читать одновременно.

В главном классе программы создаются
10 потоков читателей и
2 потока писателя ,
пытающиеся использовать это свойство.(Созадют класс который содержит это свойство)

При наличии у вас двух вариантов ('руками' и используя специально предназаначенный для этого класс из пространства имен System.Threading)
реализации свойства, реализуйте оба - именно и будет ожидаемым решением.

Для эмуляции долгих операций чтения и записи - воспользутесь случайными задержками , у операций записи задержки больше чем у операции чтения.

---------
Как сделать подобную синхронизацию? с помощью lock не получается :( , нужно что-то ещё! :blink:
 
P

Pasha

Для: softmaker
В .net тип string - неизменяемый. В то, на что ссылается переменная типа string, нельзя "писать". Можно только заставить переменную ссылатся на другую строчку. Операция смены ссылки - атомарная, все уже синхронизировано до тебя, делать еще одну "синхронизацию" сверху не имеет смысла.
Попинай давшего тебе задание, может он имел в виду поддержку транзакций для свойства.
И, кстати, покажи как ты пытался сделать через lock, может это прольет свет на задачу.
 
S

softmaker

конкретная задача про string здесь не причём, необходимо показать сам механизм , неважно что там string или какой то сложный класс (которой копируем скажем жёсткие диски, неважно) задача такая

есть одно свойство, несколько потоков записи и чтения которые применяют это свойство для записи, чтения.

смысл очевиден, когда идёт запись - читать нельзя, когда идёт чтение - писать нельзя, когда чтение, то читать могут все потоки одновременно, но писать одновременно не могут.

что такое сериализация, я незнаю, может это действительно решение задачи, тогда расскажите в нескольких словах (или есть ссылка на help)


namespace SharedRes
{
class Shared
{
static string m_SharedRes = "";
static object lockObject = new Object();
static bool Writer = false;

public string SharedRes
{
set {
Monitor.Enter(lockObject);
Console.Write("Запись.....");
Writer = true;
Thread.Sleep(2000);
m_SharedRes = value;
Writer = false;
Console.WriteLine("ok");
Monitor.Exit(lockObject);

}
get {

// что писать здесь чтобы читать нельзя когда запись, но когда читаем записывать нельзя, но читать могут все потоки одновременно. Как например узнать заблокирован объект или нет? свойства isLocked нету, но оно всё бы разрешило. Например здесь смотрим если объект закрыт то идёт запись, далее мы ждём пока пройдёт запись и далее читаем, но какбы закрываем объект для записи...
}
}
}
}
 
P

Pasha



Там есть варианты через разные объекты синхронизации, и пример на стандартный ReaderWriterLock.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!