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

Тема в разделе ".NET", создана пользователем softmaker, 22 дек 2007.

Статус темы:
Закрыта.
  1. softmaker

    softmaker Гость

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

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

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

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

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

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

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

    Pasha Гость

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

    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 нету, но оно всё бы разрешило. Например здесь смотрим если объект закрыт то идёт запись, далее мы ждём пока пройдёт запись и далее читаем, но какбы закрываем объект для записи...
    }
    }
    }
    }
     
  4. Pasha

    Pasha Гость

Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей