当前位置:编程学习 > C#/ASP.NET >>

多线程情况下会有什么问题? 如何防止

 多线程情况下会有什么问题? 如何防止 --------------------编程问答-------------------- 最明显的 就是 冲突    很常见的是 启动了别的线程却调用了 主UI线程  
winform中 Invoke      WPF和 silverlight中 Dispatcher.Invoke:

 this.Dispatcher.Invoke(new Action(() =>
            {
                //UI 
            })); --------------------编程问答-------------------- 多线程试用不档会造成死锁。 --------------------编程问答-------------------- 多个线程并行运行,很容易造成资源的竞争。需要同步,以避免。 --------------------编程问答-------------------- 当然不是同步。盲目地同步,就等于你表面上是多线程编程,其实还是阻塞自己搞同步执行。

多线程编程要注意的就是不要用单线程顺序执行的设计思维,要懂得从根源上就从并行执行的角度来设计操作对象。 --------------------编程问答-------------------- 不够具体 --------------------编程问答-------------------- 难以具体。其实多线程很简单啊,所有问题都是简单问题。又不是写书,怎么具体啊? --------------------编程问答-------------------- 多线程的问题就是同步的问题

最典型的是:
工作线程用来生产产品,生产完成之后,将产品计数加1
int prducts_counts=0;
void ProduceThreadFunc(){
    //生产产品
    products_counts++;
}
如果使用多线程不同步的话,可能会出现如下过程:
prducts_counts值为0
线程A生产了一个产品
线程A将products_counts变量读入寄存器
线程A将这个变量在寄存器中执行++运算(得到的是1)
线程A时间片到交出CPU
线程B获得CPU时间
线程B生产了一个产品
线程B将products_counts变量读入寄存器(0)
线程B将这个变量在寄存器中执行++运算(得到的是1)
线程B将寄存器内容写回内存
products_counts值为1
线程B时间片到,交出CPU
线程A继续执行
线程A将之前计算的值(1)再次写入内存
products_counts值为1

这种情况下生产了两个产品结果却是1
这还是在单核心的情况下
如果是多核心,执行过程更加混乱
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,