线程与互斥锁同步

时间:2014-06-01 18:57:12

标签: c unix pthreads mutex

我有两个主题。首先应该写一下:

1
2
3
4
5
6
7
8
9

第二个应该写:

am 1
am 2
am 3
am 4
am 5
am 6
am 7
am 8
am 9

这是我的代码:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

pthread_mutex_t mutex;

int firstCounter = 0;
int secondCounter = 0;

void *writeloop(void *arg) {
    while(firstCounter < 10) {
        pthread_mutex_lock(&mutex);
        firstCounter++;
        printf("%d\n", firstCounter);
        pthread_mutex_unlock(&mutex);
    }
    exit(0);
}

void *readLoop(void *arg) {
    while(secondCounter < 10) {
        pthread_mutex_lock(&mutex);
        secondCounter++;
        printf("am %d\n", secondCounter);
        pthread_mutex_unlock(&mutex);
    }
    exit(0);
}

int main(void)
{
    pthread_t tid, fid;
    pthread_mutex_init(&mutex, NULL);
    pthread_create(&tid, NULL, writeloop, NULL);
    pthread_create(&fid, NULL, readLoop, NULL);
    pthread_join(tid, NULL);
    pthread_join(fid, NULL);
    pthread_mutex_destroy(&mutex);
    return 0;
}

但它无法正常工作。有时第二种方法不起作用,有时它起作用。有时第一个正常工作,有时会打印:

1
2
3
4
5
6
7

我的错误在哪里?

2 个答案:

答案 0 :(得分:0)

正如评论者建议的那样,不要在线程函数上调用exit(),因为它用于终止进程。

在每个printf()之后调用fflush(stdout)也可能是个好主意 确保打印缓冲区被最后写入的线程刷新。

不确定为什么要在while()循环中使用全局变量。可能更好地使用带有局部变量的for循环。

答案 1 :(得分:0)

最好使用两个不同的互斥变量来处理两个线程以进行读写操作。

因为在当前情况下它完全取决于调度,如果写入线程首先获得调度,则它获取互斥锁。所以,后来读线程必须等待互斥锁,直到写线程释放它,反之亦然。