我是在写数据库的时候用的互斥信号量。
在线程函数外声明一个静态信号量:
static HANDLE m_hDBMutex;
MySocket::m_hDBMutex=CreateMutex(NULL,FALSE,NULL);
线程函数()
{   ……   WaitForSingleObject(m_hDBMutex,5000);  //跟这个等待时间有关么?我改了几个时间都是一样的结果
         写库(写一条数据)
   ReleaseMutex(m_hDBMutex);
   ……
}多线程,在写库之前都会等待信号量,写完库然后再释放。没理由会丢失数据,写不进去呀。
注: 一个线程会有上百条数据入库,我是在每一个线程的每一条数据入库时加的信号量。
那位大侠能帮帮忙,很急!!谢谢。

解决方案 »

  1.   

    Mutex不是这么用的而且也最好不要用在这里。用criticalsection  请google之
      

  2.   

    http://download.csdn.net/detail/fandh/1123495 
    这是多线程的例子!很简单,下载一个看看,然后再写!
      

  3.   

    sorry,没看仔细,原来不止一个线程写数据库啊。那用Event吧话说回来,criticalsection也可以。
      

  4.   

    这个问题我碰到过,数据库更新太快,一条记录还没完全更新完(更新完后会释放数据资源),马上进行下一条记录更新,这个时候会丢失,一般来说,数据库更新有极限数据,1秒一般在200条记录,批导入的则会多一些,在2000条记录左右,如果插一条记录,还有索引,触发器,视图等等的话,消耗更多资源,可插入的记录还会少一些。
    不信的话,可以做一个测试,直接调用 Insert    ,循环10000次,中间不加Sleep,看数据库到底入了多少条记录
      

  5.   

    Mutex可以用,你的同步没问题。个人更喜欢criticalsection, 更快,EVENT更清晰。
    问题可能在于你的SOCKET数据缓冲机制和数据库更新。
      

  6.   

    谢谢,这个对我挺有帮助的。
    我是调用的存储过程,数据量也比较大,估计比较耗时。应该是这里出了问题,看来我需要sleep一下。 
      

  7.   

    数据库会自己做同步,没有必要在你的代码里做同步工作,即使做,也是无效的。一个事务提交给服务器后,会有两种可能: 1成功、2失败。 如果成功,这条数据(或者说:这个改动)肯定被加到数据库里了,因为任何数据库的事务层软件都要实现四个基本性质,其中就包括这个持久性。
    失败的话,事务会“回滚”,此事务的所有改动都将恢复到之前的情况,这是事务的一致性。另外,即便事务提交成功,还有一个称作“遗失更新”的情况。
    设想如下场景:
       一个事务执行          此处c=0    update A set c=1
       马上另一个事务执行:  此处c=0    update A set c=2第一个事务执行完毕会发现:他的改动消失了。基于你的问题,我看首先,你要检查你的每个插入的事务是否成功提交了,如果成功,那么改动就一定已经加入数据库了,然后再看是否有“遗失更新”问题。另外,事务为什么会提交失败? 主要是死锁造成的。数据库一旦发现存在死锁,将从依赖环里挑选一个适合的事务,牺牲掉它。