测试比赛条件

时间:2018-12-21 08:03:23

标签: c multithreading

我今天才刚刚开始学习线程,并且想通过运行两个带有/不带有互斥锁的代码来测试线程的竞争状况。

#define HAVE_STRUCT_TIMESPEC
#include <pthread.h>
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

#define NTHREADS 3
#define ITERATIONS (long long) 1000000000

//pthread_mutex_t mutex;

static long long counter = 0;

static void * thread_f(void * arg) {
    unsigned long long i;
    (void)arg;

    for (i = 0; i != ITERATIONS; i++) {
    //  pthread_mutex_lock(&mutex);
    counter = counter + 1;
    //  pthread_mutex_unlock(&mutex);
    }
 return NULL;

}

int main(void) {
    pthread_t threads[NTHREADS];

    int i;

    for (i = 0; i != NTHREADS; i++)
        pthread_create(&threads[i], NULL, thread_f, NULL);

    for (i = 0; i != NTHREADS; i++)
        pthread_join(threads[i], NULL);


    printf("expected = %lld, actual = %lld\n", NTHREADS*ITERATIONS, counter);
    printf("experienced %lld race conditions\n", NTHREADS*ITERATIONS - counter);


    system("pause");
    return 0;
}

因此,在没有互斥锁的情况下,程序会在cmd上打印以下几行:

  

期望= 3000000000,实际= 1174158414
  经历过1825841586的比赛条件

但是,如果我将互斥锁放入代码中并运行该程序,则会弹出cmd,然后关闭自身而不会显示任何结果。

我想知道我是否编写了任何错误的代码或是否滥用互斥线,因为我对线程真的不太了解。

p.s这是使用Visual Studio在Windows 10中编码的

1 个答案:

答案 0 :(得分:1)

由于评论中的EOF,我发现我没有在代码中初始化互斥锁。

我只是添加:

if (pthread_mutex_init(&mutex, NULL)) {
    printf("Something went wrong\n");
    return 1;
}

主要,现在一切正常。