два потока, одна переменная...
От: sharcUs Беларусь http://sharcus.blogspot.com/
Дата: 18.01.07 08:32
Оценка:
Есть класс:
class Foo : IDisposable
{
    void IDisposable.Dispose() { }
    public void Dispose() { }
    
    private MyObj obj = null;
    ...
    void Run ()
    {
        ...
        obj = new MyObj();
        ...
    }
    ...
}

static class Program
{
    static void Main(string[] args)
    {
        using (Foo foo = new Foo())
        {
                foo.Run();
                ...
        }
        ...        
    }
}


Метод Run с помошью Invoke исполняется другом потоке, и там же создается экземпляр obj.
Далее работа Foo предполагается в основном потоке.
В с++ при разрушении obj произошло бы исключения изза того что obj был создан на другой куче.
Насколько правомерен и корректен(мало ли подобный код в .NET, и какими последствиями чреват такой код, если он некорректен?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: два потока, одна переменная...
От: Константин Л. Франция  
Дата: 18.01.07 09:06
Оценка:
Здравствуйте, sharcUs, Вы писали:

U>Есть класс:

U>
U>class Foo : IDisposable
U>{
U>    void IDisposable.Dispose() { }
U>    public void Dispose() { }
    
U>    private MyObj obj = null;
U>    ...
U>    void Run ()
U>    {
U>        ...
U>        obj = new MyObj();
U>        ...
U>    }
U>    ...
U>}

U>static class Program
U>{
U>    static void Main(string[] args)
U>    {
U>        using (Foo foo = new Foo())
U>        {
U>                foo.Run();
U>                ...
U>        }
U>        ...        
U>    }
U>}

U>


U>Метод Run с помошью Invoke исполняется другом потоке, и там же создается экземпляр obj.

U>Далее работа Foo предполагается в основном потоке.
U>В с++ при разрушении obj произошло бы исключения изза того что obj был создан на другой куче.
U>Насколько правомерен и корректен(мало ли подобный код в .NET, и какими последствиями чреват такой код, если он некорректен?

корректен. Но тут вообще трудно что-то сказать без полного кода.
Кстати, в с++ в этом случае никаких исключений не будет. В win у всех потоков, принадлежащих одному процессу куча одна.
Re[2]: два потока, одна переменная...
От: sharcUs Беларусь http://sharcus.blogspot.com/
Дата: 18.01.07 09:42
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>корректен. Но тут вообще трудно что-то сказать без полного кода.

КЛ>Кстати, в с++ в этом случае никаких исключений не будет. В win у всех потоков, принадлежащих одному процессу куча одна.

в приведенном коде допустил ошибку которая, противоречит тексту после кода и может вводить в заблужение

конечно не:

                foo.Run();
                ...


а что то вроде такого:

    run_delegate methodDelegate = new run_delegate(obj.Run);
    AsyncCallback async = new AsyncCallback(CallBack);
    methodDelegate.BeginInvoke(async, mytask);
    
    ...


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

Интересует корректность подобной функциональности именно с точки зрения работы с памятью в .NET, когда создание объекта осуществляется в одном потоке, а работа с ним и его disposing осуществялется в другом потоке.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: два потока, одна переменная...
От: Константин Л. Франция  
Дата: 18.01.07 12:48
Оценка:
Здравствуйте, sharcUs, Вы писали:

[]

U>Собственно говоря в Run происходит инициализация obj которая занимает достаточно продолжительное время, что бы решить вынести ее в отдельный поток.

U>До завершения инициализации в Run работа с Foo осуществлятся не будет, поэтому проблемы синхронизации здесь нет. После отработки Run
U>осуществляется работа с obj через Foo в основном потоке без каких-либо ньюансов, и при завершении работы программы Foo уничтожается.

а что делает в это время главный поток? Просто ждет когда проинициализируется объект? Если да, то перенос инициализации в доп. поток не имеет смысла.

U>Интересует корректность подобной функциональности именно с точки зрения работы с памятью в .NET, когда создание объекта осуществляется в одном потоке, а работа с ним и его disposing осуществялется в другом потоке.


это корректно, но не слишком "правильно" с точки зрения дизайна. Хотя могут быть разные ситуации...
Re[4]: два потока, одна переменная...
От: sharcUs Беларусь http://sharcus.blogspot.com/
Дата: 18.01.07 13:08
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, sharcUs, Вы писали:


КЛ>[]


U>>Собственно говоря в Run происходит инициализация obj которая занимает достаточно продолжительное время, что бы решить вынести ее в отдельный поток.

U>>До завершения инициализации в Run работа с Foo осуществлятся не будет, поэтому проблемы синхронизации здесь нет. После отработки Run
U>>осуществляется работа с obj через Foo в основном потоке без каких-либо ньюансов, и при завершении работы программы Foo уничтожается.

КЛ>а что делает в это время главный поток? Просто ждет когда проинициализируется объект? Если да, то перенос инициализации в доп. поток не имеет смысла.


U>>Интересует корректность подобной функциональности именно с точки зрения работы с памятью в .NET, когда создание объекта осуществляется в одном потоке, а работа с ним и его disposing осуществялется в другом потоке.


КЛ>это корректно, но не слишком "правильно" с точки зрения дизайна. Хотя могут быть разные ситуации...


метод Run в качестве делегата передается диалогу с прогресБаром, где отображается индикатор выполнения операции инициализации
там он и запускается в отдельном потоке. Отдельный поток нужен для того что бы не мешать нормальной отрисовке графической части программы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.