Безопасны ли потоки, возвращающиеся к созданию потока? - PullRequest
1 голос
/ 01 декабря 2011

Мне не нравится этот код, но я всегда путаюсь с потоками, поэтому хотел, чтобы кто-то еще высказал свое мнение, прежде чем предложить изменение; Безопасен ли этот поток (хотя код Psuedo основан на C #):

class ThreadCreator
{
    private AnObject obj = new AnObject();
    public ThreadCreator()
    {
        for (int i = 0; i < 100; ++i)
        {
            ThingToThread th = new ThingToThread();//don't care about losing ref to th for this question
            th.sendMsg = this.getMessage;
            Thread t = new Thread(th.doThing);
            t.SetApartmentState(ApartmentState.STA);
            t.Start();
        }
    }

    public void getMessage( string stuff )
    {
        ...
        obj.DoThing(stuff);
        ...
    }
}

class ThingToThread
{
    public delegate void sendMsg(string stuff);

    public void doThing()
    {
        ...
        this.sendMsg("ohh that's interesting");
        ...
    }
}

Ответы [ 2 ]

4 голосов
/ 01 декабря 2011

Вы не перезваниваете ни в какую другую ветку.

Ваш код выполнит делегат в новом потоке, как и любой другой вызов функции.

Если getMessage не является поточно-ориентированным, ваш код сломается.

0 голосов
/ 01 декабря 2011

Ваш пример не является потокобезопасным, если вы хотите обеспечить его безопасность, я бы очень посоветовал использовать BackgroundWorker для выполнения в новом потоке, но для отправки сообщений обратно в основной поток.

Например:

class ThreadCreator
{
    private AnObject obj = new AnObject();
    public ThreadCreator()
    {
        for (int i = 0; i < 100; ++i)
        {
            ThingToThread th = new ThingToThread();

            BackgroundWorker worker = new BackgroundWorker();
            worker.DoWork += th.DoWork;
            worker.ProgressChanged += WorkerProgressChanged;
            worker.RunWorkerAsync();
        }
    }

    private void WorkerProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        string stuff = e.UserState as string;
        obj.DoThing(stuff);
    }
}

И ваш метод ThingToThread DoWork будет выглядеть так:

public void DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;

    worker.ReportProgress(50, "Half way there");

    worker.ReportProgress(100, "Finished");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...