none
多线程加锁问题? RRS feed

  • 问题

  • 在程序中运用多线程时,什么情况下需要加锁?

    1. 两个线程调用同一函数获取页面的源码,

    t1 代码部分(已设置STA):

    HtmlDoc = ReadLog(url)

    t2 代码部分:

    HtmlDoc = ReadLog(url)

        Private Function ReadLog(ByVal url As String) As Object
            Dim wb As New WebBrowser
            wb.Navigate(url)

    ........................

    2.两个线程更新数据库同一表同一记录的不同字段,这个应该需要加锁吧?

    我用ACCESS2003,线程1对字段1,2操作,线程2操作字段3 。操作前先判断记录是否存在,存在就更新,不存在则插入。

    锁应该加在哪里?

    2012年9月9日 3:19

答案

  • 加锁的目的在于对同一个数值操作才需要。现在你是同一个记录但是不同的字段,应该不需要加锁的;不过你要是每一个线程里边都用一个SqlConnection独占打开一个数据库的话可能需要锁(防止同时打开而抛出异常)。所以结论为了保证SqlConnection的独占性,枷锁。

    //"obj"应该是一个静态共享变量…… public void FunUpdate(int order) { lock(obj) { using(SqlCommand cmd = new SqlCommand(....)) { cmd.Open(); if(order==1) { //First thread do.... }
    else
    {
    //Second thread do....
    }
    con.Close();

    } } }

    Call like this:

    Thread th1 = new Thread(()=>{FunUpdate(1);});
    th1.Start();
    Thread th2 = new Thread(()=>{FunUpdate(2);});
    th2.Start();

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年9月9日 6:51
    版主