相关疑难解决方法(0)

线程安全的单元测试?

我写了一个类和许多单元测试,但我没有让它线程安全.现在,我想让类线程安全,但为了证明它并使用TDD,我想在开始重构之前编写一些失败的单元测试.

有什么好办法吗?

我的第一个想法是创建一些线程并让它们以不安全的方式使用该类.用足够的线程做足够的时间,我一定会看到它破裂.

.net c# nunit unit-testing thread-safety

66
推荐指数
3
解决办法
1万
查看次数

英特尔检查器报告我的螺旋锁实现中的数据竞争

我使用Windows中的Interlocked函数制作了一个非常简单的自旋锁,并在双核CPU上测试它(两个线程增加一个变量);

该程序似乎工作正常(它每次都给出相同的结果,但不使用同步时不是这种情况),但英特尔Parallel Inspector表示存在值+ = j的竞争条件(参见下面的代码).使用Critical Sections而不是SpinLock时,警告消失.

我的SpinLock实现是否正确?这真的很奇怪,因为所有使用的操作都是原子操作并且具有适当的内存屏障,并且不应该导致竞争条件.

class SpinLock
{
   int *lockValue;
   SpinLock(int *value) : lockValue(value) { }

   void Lock() {
      while(InterlockedCompareExchange((volatile LONG*)lockValue, 1, 0) != 0) {
          WaitABit();
      }
   }

   void Unlock() { InterlockedExchange((volatile LONG*)lockValue, 0); }
};
Run Code Online (Sandbox Code Playgroud)

测试程序:

static const int THREADS = 2;
HANDLE completedEvents[THREADS];
int value = 0;
int lock = 0; // Global.

DWORD WINAPI TestThread(void *param) {
    HANDLE completed = (HANDLE)param;
    SpinLock testLock(&lock);

    for(int i = 0;i < 1000*20; i++) …
Run Code Online (Sandbox Code Playgroud)

c++ winapi synchronization spinlock intel-inspector

8
推荐指数
1
解决办法
2754
查看次数