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

解决方案 »

  1.   

    最明显的 就是 冲突    很常见的是 启动了别的线程却调用了 主UI线程  
    winform中 Invoke      WPF和 silverlight中 Dispatcher.Invoke: this.Dispatcher.Invoke(new Action(() =>
                {
                    //UI 
                }));
      

  2.   

    多线程的问题就是同步的问题最典型的是:
    工作线程用来生产产品,生产完成之后,将产品计数加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
    这还是在单核心的情况下
    如果是多核心,执行过程更加混乱