2012-11-04 34 views
3

我有一个线程安全的程序,我想测试(见下文)。我不确定如何开始测试程序,因为这将是我的第一个测试程序。结果应该是使用此线程安全程序实现的演示,以及为什么它是测试线程安全程序(如示例)的最佳替代方法。如何在c中测试线程安全的实现?

#include <errno.h> 
#include <pthread.h> 
static pthread_mutex_t listlock = PTHREAD_MUTEX_INITIALIZER; 

int accessdata_r(void) { /* return nonnegative traversal key if successful */ 
    int error; 
    int key; 
    if (error = pthread_mutex_lock(&listlock)) {  /* no mutex, give up */ 
     errno = error; 
     return -1; 
    } 
    key = accessdata(); 
    if (key == -1) { 
     error = errno; 
     pthread_mutex_unlock(&listlock); 
     errno = error; 
     return -1; 
    } 
    if (error = pthread_mutex_unlock(&listlock)) { 
     errno = error; 
     return -1; 
    } 
    return key; 
} 

int adddata_r(data_t data) {  /* allocate a node on list to hold data */ 
    int error; 
    if (error = pthread_mutex_lock(&listlock)) {  /* no mutex, give up */ 
     errno = error; 
     return -1; 
    } 
    if (adddata(data) == -1) { 
     error = errno; 
     pthread_mutex_unlock(&listlock); 
     errno = error; 
     return -1; 
    } 
    if (error = pthread_mutex_unlock(&listlock)) { 
     errno = error; 
     return -1; 
    } 
    return 0; 
} 

int getdata_r(int key, data_t *datap) {    /* retrieve node by key */ 
    int error; 
    if (error = pthread_mutex_lock(&listlock)) {  /* no mutex, give up */ 
     errno = error; 
     return -1; 
    } 
    if (getdata(key, datap) == -1) { 
     error = errno; 
     pthread_mutex_unlock(&listlock); 
     errno = error; 
     return -1; 
    } 
    if (error = pthread_mutex_unlock(&listlock)) { 
     errno = error; 
     return -1; 
    } 
    return 0; 
} 

int freekey_r(int key) {         /* free the key */ 
    int error; 
    if (error = pthread_mutex_lock(&listlock)) {  /* no mutex, give up */ 
     errno = error; 
     return -1; 
    } 
    if (freekey(key) == -1) { 
     error = errno; 
     pthread_mutex_unlock(&listlock); 
     errno = error; 
     return -1; 
    } 
    if (error = pthread_mutex_unlock(&listlock)) { 
     errno = error; 
     return -1; 
    } 
    return 0; 
} 
+0

http://en.wikipedia.org/wiki/Fuzz_testing *即使通常不被视为“输入”的项目也可能会模糊化,例如......线程的精确交错。* –

+0

注意:不应该这个'if(error = pthread_mutex_unlock(&listlock))'是'if((error = pthread_mutex_unlock(&listlock)))'? – 2012-11-04 11:51:24

+1

你可能想看看Helgrind,甚至可能是Promela/Spin。 – ninjalj

回答

0

这是一个相对简单的选项来测试您的实现,这不是唯一的现有选项。

  1. 创建函数这将增加X项目列表(这可能是定期计数器)
  2. 创建其在循环中获取相同的数据的功能。

  3. 创建几个线程(pthread_create)并分配给每个函数。

  4. 这样你看看是否没有解锁,为了检查正确性,你应该在插入时添加一些类型的时间戳(你需要插入一个带时间戳的值),为每个线程保存一些数组将保存结果,最后打印结果并查看时间戳是否保留正确性。