有人可以帮助我解决一个情况,即没有互联网“definetely”会导致错误的结果。
我需要这个,以便我可以测试我的互斥量实现。
- Neeraj
答案 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 );
。
在没有加载的系统上,程序会显示资金已经“在转移过程中”消失了 - 帐户在“交易”中间被读取(问题在这里没有交易),所以没有隔离。使用互斥锁,您将看到最终状态 - “转移后”。