需要互斥的情况?

时间:2010-06-28 09:31:13

标签: c++ mutex

有人可以帮助我解决一个情况,即没有互联网“definetely”会导致错误的结果。

我需要这个,以便我可以测试我的互斥量实现。

- Neeraj

8 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

当需要互斥时,你肯定需要一个互斥(或类似的机制)。

答案 3 :(得分:1)

您只是测试它是否正确锁定?如果是这样可能是这样的?两个线程

#Global Variables
int counter = 1
int factorial = 1


#Critical Section
counter++
Delay for some amount of time
factorial *= counter
#End Critical Section

如果您的Mutex工作,那么最终结果应为6.否则它将是9. 编辑或3我认为*=不是原子的,但不是6。

答案 4 :(得分:0)

经典案例是丈夫和妻子共享的ATM。一个存款,另一个存款不同。如果关键部分没有被互斥锁适当地保护,那么每个部分都可能会看到不一致的结果。

如果需要“明确的情况”,请丈夫存款,然后睡觉足够的时间,以便妻子可以提款。丈夫的结果将覆盖妻子,而帐户余额不再是ACID。

答案 5 :(得分:0)

我认为不是,因为从应用程序的角度来看,在当前操作系统中实现的调度程序不是确定性的。但是,如果你启动了很多线程并多次测试代码,那么冲突的可能性应该足够高。

答案 6 :(得分:0)

以下是我在互斥实现测试套件中使用的测试类型:

// 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();

当然,您可以根据自己的需要调整HUGE_VAL,因为互斥锁用于防止并发访问。因此,要测试它,你需要创建并发性,并且机器越快,HUGE_VAL就越大......

答案 7 :(得分:0)

您可以模拟用于说明数据库事务的着名"bank transfer" scenario。我们有帐户A和B,需要从A到B转移200美元。

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 );

在没有加载的系统上,程序会显示资金已经“在转移过程中”消失了 - 帐户在“交易”中间被读取(问题在这里没有交易),所以没有隔离。使用互斥锁,您将看到最终状态 - “转移后”。