首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程同步

线程同步
EN

Stack Overflow用户
提问于 2011-09-08 13:11:21
回答 1查看 472关注 0票数 3

数据必须在线程之间共享。哪种是最好的同步方法?

锁是更好的方法还是互斥锁?

代码语言:javascript
复制
namespace ConsoleApplication8
{
    class Data
    {
        public int X
        {
            set;
            get;
        }

        public int Y
        {
            get;
            set;
        }

        public int result;
    }

    class Program
    {
        static int a;
        private static object aLock = new object();

        static void Main(string[] args)
        {
            ParameterizedThreadStart aStart = new ParameterizedThreadStart(Addition);
            Thread aThread = new Thread(aStart);
            Data aData = new Data();
            aData.X = 10;
            aData.Y = 20;

            Thread aThread2 = new Thread(aStart);
            aThread2.Start();


            aThread.Start(aData);
            aThread.Join();
            aThread2.Join();
            Console.WriteLine("End of the program");
        }

        static void Addition(object data)
        {
            var a = data as Data;
            var b = a.X + a.Y;
            a.result = b;

            Console.WriteLine(a.result);
            Thread.Sleep(1000);
            Console.WriteLine("End of thread");
            updateValue();
        }

        static void updateValue()
        {
            lock (aLock)
            {
                a++;
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2011-09-08 13:43:07

你有两个“同步”线程的地方。

在继续主线程之前,您正在使用Thread.Join等待线程完成。这很好。

您还使用了一个锁来确保一次只有一个线程递增计数器变量a。这也很好,但可以改进。在System.Threading中有一个名为Interlocked的类,它可以以线程安全的方式为您执行增量。

代码语言:javascript
复制
Interlocked.Increment(ref a);

您的代码确实在两个地方使用了变量a -在Addition内部,您有一个局部变量a,它隐藏了静态外部变量a。我想这只是个巧合。

另一个问题是您的Addition方法接受object作为参数。我理解为什么它不接受Data作为参数,因为ParameterizedThreadStart需要一个对象。有一个更好的方法来解决这个问题。

请尝试以下代码:

代码语言:javascript
复制
private static int __counter = 0;

public class Data
{
    public int X { set; get; }
    public int Y { set; get; }
    public int Result { set; get; }
}

private void Addition(Data data)
{
    data.Result = data.X + data.Y;
    Interlocked.Increment(ref __counter);

    Thread.Sleep(1000);

    Console.WriteLine(data.Result);
    Console.WriteLine("End of thread");
}

现在Main可以写成:

代码语言:javascript
复制
void Main()
{
    ParameterizedThreadStart pts = o => Addition(o as Data);

    var t1 = new Thread(pts);
    var t2 = new Thread(pts);

    t1.Start(new Data { X = 10, Y = 20 });
    t2.Start(new Data { X = 13, Y = 42 });

    t1.Join();
    t2.Join();

    Console.WriteLine(__counter);
    Console.WriteLine("End of the program");
}

这应该会更整洁一点。

我看不到您在代码中确切地共享了什么数据。也许你可以详细说明一下?

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7343375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档