代码之家  ›  专栏  ›  技术社区  ›  sud03r

需要互斥的情况?

  •  4
  • sud03r  · 技术社区  · 14 年前

    有人能帮我举一个例子吗?在这个例子中,缺少互斥“肯定”会导致错误的结果。

    我需要这个来测试我的互斥实现。

    -- 尼拉吉

    8 回复  |  直到 14 年前
        1
  •  7
  •   avakar    14 年前

    考虑使用互斥体进行同步的任何正确代码。通过移除锁定,您将向程序引入新的(可能不正确的)行为(执行)。但是,新代码仍将包含所有旧行为,因此始终至少有一次执行将产生正确的结果。因此,你所要求的是不可能的。

        2
  •  2
  •   scribu    14 年前

    制作一个包含fork()的程序。然后,使子进程和父进程都从同一个文件中读取一个数字,并将其递增,然后将其写回该文件。在每一个过程中做100次。

        3
  •  1
  •   adf88    14 年前

    当需要互斥时,您肯定需要互斥(mutex)或类似的机制。

        4
  •  1
  •   Martin Smith    14 年前

    #Global Variables
    int counter = 1
    int factorial = 1
    
    
    #Critical Section
    counter++
    Delay for some amount of time
    factorial *= counter
    #End Critical Section
    

    如果互斥锁工作,那么最终结果应该是6,否则将是9。 或者我想是3个 *=

        5
  •  0
  •   Philipp    14 年前

    我不这么认为,因为从应用程序的角度来看,当前操作系统中实现的调度器是不确定的。但是,如果启动大量线程并多次测试代码,则冲突的概率应该足够高。

        6
  •  0
  •   duffymo    14 年前

    如果需要“确定的情况”,让丈夫先存一笔钱,然后再睡上足够的时间,这样妻子就可以取款了。丈夫的结果将覆盖妻子的结果,账户余额不再是酸性的。

        7
  •  0
  •   Joan Rieu    14 年前

    // global:
    enum { HUGE_VAL = 50000 }
    Mutex mutex;
    int variable;
    
    // main thread
    mutex.lock();
    thread.run();
    for(int i = 0; i < HUGE_VAL; ++i)
        ++variable;
    assert(variable == HUGE_VAL);
    mutex.unlock();
    thread.join();
    assert(variable == -HUGE_VAL);
    
    // parallel thread
    mutex.lock();
    variable = -HUGE_VAL;
    mutex.unlock();
    

    当然,可以根据您的感受调整巨大的值,因为互斥是用来防止并发访问的。因此,要测试它,您需要创建并发,并且机器越快,就应该有越大的值。。。

        8
  •  0
  •   Community dbr    7 年前

    你可以模拟著名的 "bank transfer" scenario 用于说明数据库事务。我们有A和B两个账户,需要把200美元从A转到B。

    类C++伪代码(未测试)

     int accountA = 200;
     int accountB = 0;
    
     void transfer( int& from, int& to, int amount )
     {
         //mutex acquisition should be here
         if( from < amount ) {
             printf( "error" );
             // mutex release should be here
             return;
         }
         from -= amount;
         Sleep( 5000 ); //wait idle for 5 seconds
         to += amount;
         // mutex release should be here
     }
    
     void display( const int& account1, const int& account2 )
     {
         //mutex acquisition should be here
         Sleep( 3000 ); //wait 3 seconds
         printf( "%d", account1 );
         printf( %d", account2 );
         // mutex release should be here
     }
    

    现在生成两个线程并执行 transfer( accountA, accountB, 200 ); display( accountA, accountB );