返回首页

{A}{S0的}介绍
信号量是一个同步技术,在这里我们可以控制线程的数量访问anbsp;资源。在锁/互斥,时间只有一个线程可以访问的资源。但信号灯允许多个线程tonbsp;一次访问相同的资源。我们可以限制线程thatnbsp的数量可以访问相同的thenbsp;资源。在这篇文章中,我已经展示了三种不同的方式来访问资源。无1。不同步NO-2。与监视器同步NO-3。与信号灯同步使用代码不同步
没有同步,所有线程同时运行,并同时执行同一段代码。有多少线程可以访问它没有限制。以下是代码:

private void btnNoSync_Click(object sender, EventArgs e)

{

            listBox1.Items.Add("== No Synchronization ===========");

            int TotalThread = 5;

            Thread[] Threads = new Thread[TotalThread];

            for (int i = 0; i < TotalThread; i++)

            {

                Threads[i] = new Thread(new ThreadStart(AccessCode));

                Threads[i].IsBackground = true;

                Threads[i].Start();

            } 

}

public void AccessCode()

{

   listBox1.BeginInvoke(new ParameterizedThreadStart(UpdateUI), new object[] 

       {"Thread ID : " + Thread.CurrentThread.ManagedThreadId.ToString() + ": Entered" }

                        );

   Thread.Sleep(500);

   listBox1.BeginInvoke(new ParameterizedThreadStart(UpdateUI), new object[]  

       { "Thread ID : " + Thread.CurrentThread.ManagedThreadId.ToString() + " : Exit" }

                        );

}

 

// Following code is used to update UI

public void UpdateUI(object objOutput)

{

   listBox1.Items.Add(objOutput.ToString());

}
与监视器同步
同步显示器类,只有一个线程可以访问相同的资源,在同一时间。线程同时运行,但它可以在一次访问块代码之一。有线程上的限制,所以,只有一个线程可以访问一个特定的代码块。{C}与信号灯同步
在同步信号类,我们可以允许多个线程访问同一代码块。其实,我们可以指定多少线程可以在同一时间同一代码块的访问。 测试代码
信号可以很容易地测试。运行的应用程序,并按下所有的按钮逐个看到这控制线程thatnbsp的总数的信号效果;可以同时执行一些代码块。信号是一个资源的同步技术和全系统同步资源。历史2011年11月19日,初始后

回答

评论会员:。圣保罗Zemek 时间:2012/02/06
我觉得这里的大问题是:当一个需要使用一个信号?

其实,你比一个信号锁,但他们的目的是非常不同的。
即使你可以作为一个信号,即只允许一次一个比较锁,锁的存在,以避免由其他线程看到的是"不完整"的国家。
一个非常简单的例子可以显示在屏幕上画线使用旧的"的MoveTo"和"DrawTo"功能。
如果一个线程的MoveTo 0,0,0 DrawTo 100
而另一个人不会同步的MoveTo 0,100,100,100 DrawTo,我们最终可能会做:
MOVETO 0,0 - 无用
MOVETO 0,100
DrawTo 100,0
DrawTo 100,100

这将给我们一个完全错误的结果,因为使用了一个不完整的状态。使用一个信号灯,不会有助于解决这些问题。

那么,什么是一个信号的优势
在此情况下,你认为应该使用一个信号灯?如果不避免一个线程看到不完整的状态...其目的是什么?
我只能说,我个人使用的信号灯运行许多动画一次,处理器的数量限制并发线程数量...毕竟,在同一时间有多个线程运行,只会降低性能。
你要创建一个新的编程语言吗?
你想知道如何创建一个虚拟机?
他们是如何工作的,至少有兴趣吗?
所以,看到我的文章:{A2}
评论会员:游客 时间:2012/02/06
Naerling:当然非常有趣。然而,有没有讨论有关问题时,为什么要使用监视器或信号灯或什么看出来的。当然,代码是对你不是很复杂,但对新人的主题是。信号灯的例子,当然需要一些额外的解释。此外,你为什么要传递对象的AccessCodeWithSemaphore和的updateUI,而你已经知道你期待一个信号量和字符串?看起来像不好的做法,我...所以三的麻烦和很好的例子。我愿意重新投票4甚至5,如果你给一些更深入的解释主体
。Pranjit Kalita:感谢您的宝贵comments.Firstly我同意你关于有没有讨论有关课程。我要更新一些额外的交代本文。其次,因为我已经使用ParametrizedThreadStart委派,,呼吁AccessCodeWithSemaphore的updateUI方法,使所有这两个函数的签名应符合与paramterizedThreadStart委托。出于这个原因,当我们启动一个线程的ThreadStart()方法,我们通过信号变量。但在第二种情况下母鸡,我们称为BeginInvoke方法,我已经通过将其转换为对象也可以通过字符串的字符串。实体商店,我将在明年修订更新。
pranjit Kalita
inovators
评论会员:游客 时间:2012/02/06
Naerling:展望修订。让我知道当你更新的文章。我已经看到了一些有趣的点,圣保罗和Supercatimgsrc=http://www.orcode.com/img/ico/smiley_smile.gif提到这是一个面向对象的世界。{体C3}