读/写锁 作为工作中的一部分,我在C++中实现了一个读/写锁类。在将代码推向生产环境之前,我应该在类上运行什么样的测试,以确保它能够正确运行
显然,我已经在我的类上执行了一些健全性测试,确保一次只能有一个编写器访问,确保发布和声明正确地递增和递减,等等读/写锁 作为工作中的一部分,我在C++中实现了一个读/写锁类。在将代码推向生产环境之前,我应该在类上运行什么样的测试,以确保它能够正确运行,c++,multithreading,testing,synchronization,C++,Multithreading,Testing,Synchronization,显然,我已经在我的类上执行了一些健全性测试,确保一次只能有一个编写器访问,确保发布和声明正确地递增和递减,等等 我正在寻找能够保证我的类的稳定性和防止边缘情况的测试。测试多线程代码似乎比标准代码困难得多。既然您已经实现了读/写锁,那么显然您应该在多线程环境中测试它。在没有写操作的情况下,不应阻止多个读线程等测试场景,并且在数小时内运行数千个读/写操作不会导致死锁,这可能是一个良好的开端。既然您已经实现了读/写锁,那么显然您应该在多线程环境中测试它。在没有写操作的情况下,不应阻止多个读线程等测试场
我正在寻找能够保证我的类的稳定性和防止边缘情况的测试。测试多线程代码似乎比标准代码困难得多。既然您已经实现了读/写锁,那么显然您应该在多线程环境中测试它。在没有写操作的情况下,不应阻止多个读线程等测试场景,并且在数小时内运行数千个读/写操作不会导致死锁,这可能是一个良好的开端。既然您已经实现了读/写锁,那么显然您应该在多线程环境中测试它。在没有写操作的情况下,不应阻止多个读线程等测试场景,并且在数小时内运行数千个读/写操作不会导致死锁,这可能是一个良好的开端。测试多线程代码非常困难,因此,您应该由在编写多线程应用程序方面经验丰富的同事对您的测试进行详细的代码审查,以补充您的测试 测试多线程代码非常困难,因此您应该由编写多线程应用程序的经验丰富的同事对您的测试进行详细的代码审查 运行两个同时执行此操作的线程
long long int j = 0;
long long int oldJ = 0;
while (true)
{
for (long long int i = 0; i <= 100000; ++i)
// try and make it 64 bits to be sure its non-atomics :)
{
oldJ = j;
YourRead(j) // read in j
assert(j == (oldJ + 1));
SleepSomeRandomPeriod( );
YourWrite(i)
SleepSomeRandomPeriod( );
}
}
运行两个执行此操作的线程
long long int j = 0;
long long int oldJ = 0;
while (true)
{
for (long long int i = 0; i <= 100000; ++i)
// try and make it 64 bits to be sure its non-atomics :)
{
oldJ = j;
YourRead(j) // read in j
assert(j == (oldJ + 1));
SleepSomeRandomPeriod( );
YourWrite(i)
SleepSomeRandomPeriod( );
}
}
我想您可以从查看成熟代码中包含的测试开始。例如,GNU libc nptl的pthreads实现包括读写锁和一些测试
$ ls nptl/tst-rwlock*
nptl/tst-rwlock1.c
nptl/tst-rwlock10.c
nptl/tst-rwlock11.c
nptl/tst-rwlock12.c
nptl/tst-rwlock13.c
nptl/tst-rwlock14.c
nptl/tst-rwlock2.c
nptl/tst-rwlock3.c
nptl/tst-rwlock4.c
nptl/tst-rwlock5.c
nptl/tst-rwlock6.c
nptl/tst-rwlock7.c
nptl/tst-rwlock8.c
nptl/tst-rwlock9.c
我想您可以从查看成熟代码中包含的测试开始。例如,GNU libc nptl的pthreads实现包括读写锁和一些测试
$ ls nptl/tst-rwlock*
nptl/tst-rwlock1.c
nptl/tst-rwlock10.c
nptl/tst-rwlock11.c
nptl/tst-rwlock12.c
nptl/tst-rwlock13.c
nptl/tst-rwlock14.c
nptl/tst-rwlock2.c
nptl/tst-rwlock3.c
nptl/tst-rwlock4.c
nptl/tst-rwlock5.c
nptl/tst-rwlock6.c
nptl/tst-rwlock7.c
nptl/tst-rwlock8.c
nptl/tst-rwlock9.c
经常使用ASSERT/ASSERT来测试您的所有假设并检查前置和后置条件。经常使用ASSERT/ASSERT来测试您的所有假设并检查前置和后置条件。如果您能够在工作代码中使用Boost,则应该使用实现读/写锁定的类
即使它不能100%满足您的需要,您也应该使用代码中的思想来编写代码,并且,如果Boost代码有我没有检查过的共享互斥体测试,您应该将它们添加到您的测试中。如果您能够在工作代码中使用Boost,您应该使用实现读/写锁定的类
即使它不能100%满足您的需要,您也应该使用代码中的思想来编写代码,并且,如果Boost代码中有我没有检查过的共享互斥体测试,您应该将它们添加到您的测试中。IBM有。或许C++有什么类似的东西? IBM有。也许C++有什么类似的东西? 确保你在一个真正有多CPU的机器上尝试你的压力测试。这通常会发现比单CPU机器上运行的任何东西都多的多线程问题 然后在64位、更快的CPU、更多的CPU等机器上测试它 正如@onebyone.livejournal.com所说,使用具有非一致性内存缓存的机器;不过,根据调查,这可能很难找到
当然,在尽可能多的不同机器上使用该代码不会有什么坏处,也是发现问题的好方法。请确保在真正有多个CPU的机器上进行压力测试。这通常会发现比单CPU机器上运行的任何东西都多的多线程问题 然后在64位、更快的CPU、更多的CPU等机器上测试它 正如@onebyone.livejournal.com所说,使用具有非一致性内存缓存的机器;不过,根据调查,这可能很难找到
当然,在尽可能多的不同机器上使用代码不会有什么坏处,也是发现问题的好方法。通常,我会提供避免实现自己的锁的指导,除非您已经证明现有的稳定实现无法满足您的性能需要 测试和构建同步原语可能很棘手且不直观 使用boost::shared_互斥体的指导是非常明智的,如果您在Win32平台上,我会尽可能指导您使用,因为它们既健壮又快速
虽然它对今天的生产产品没有帮助,但在Visual Studio 2010 Beta 1中,我们添加了一个虽然不跨平台但将成为VS2010 redist的一部分的锁。一般来说,我会提供一些指导,以避免实现您自己的锁,除非您已经证明现有的稳定实现无法满足您的性能需求 测试和构建同步p 基本体可能很棘手,而且不直观 使用boost::shared_互斥体的指导是非常明智的,如果您在Win32平台上,我会尽可能指导您使用,因为它们既健壮又快速
尽管这对今天的生产产品没有帮助,但在Visual Studio 2010 Beta 1中,我们添加了一个虽然不跨平台但将成为VS2010 redist的一部分的测试。请确保在具有多个CPU核的机器上进行测试,或者至少在具有超读功能的CPU上进行测试。多线程存在许多问题,这些问题只会在线程在不同CPU上并行运行时发生,或者更频繁地发生 确保在具有多个CPU核的机器上进行测试,或者至少在一个具有超线程的CPU上进行测试。多线程存在许多问题,这些问题只会在线程在不同CPU上并行运行时发生,或者更频繁地发生 Daadlock很难测试。您如何知道是否发生了死锁?它可能只是太慢了!死锁的定义是,一个锁永远不会被释放,因为多个动作彼此等待而不会减速。因此,如果长时间运行程序,则很容易检测到。我过去经常不间断地运行我的程序一周,然后用数千个请求来检测死锁。Daadlock很难测试。您如何知道是否发生了死锁?它可能只是太慢了!死锁的定义是,一个锁永远不会被释放,因为多个动作彼此等待而不会减速。因此,如果长时间运行程序,则很容易检测到。我过去经常不间断地运行我的程序一周,然后用数千个请求来检测死锁。打败我吧。让多线程测试工作起来非常困难。询问一位有经验的同事会让你更快地达到90%。更好的是,如果可能的话,将代码发布到这里的互联网上,让我们所有人都来审核。打败我吧。让多线程测试工作起来非常困难。询问一位有经验的同事会让你更快地达到90%。如果可能的话,更好的是,在这里将代码发布到internet,让我们大家都可以对其进行审核。您是否有理由实现自己的代码,而不是使用经过良好测试的优秀实现之一,如Boost或Intel TBB?还有实现读/写锁的Apache Portable Runtime APR。很久以前,当这些库都不存在时,我不得不为Windows实现自己的条件变量;这是该平台上不存在的另一个原语。有什么原因使您实现了自己的原语,而不是使用经过良好测试的优秀实现,如Boost或Intel TBB?还有实现读/写锁的Apache Portable Runtime APR。很久以前,当这些库都不存在时,我不得不为Windows实现自己的条件变量;这是该平台上不存在的另一个原语。