2015-02-06 72 views
2

我正在玩一个相当简单的C例子。该程序创建两个线程并且并行启动它们。每个线程都设计为使用Mutex修改全局变量,并打印出该值。同步屏幕输出与互斥和pthread

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

int A=10; 
pthread_mutex_t M; 

void *codice_Th1(void *arg) { 
    int i; 
    for (i=0; i<10;i++){ 
    pthread_mutex_lock(&M); 
    printf("Thread %s: ", (char *)arg); 
    A++; 
    printf("A = %d \n", A); 
    pthread_mutex_unlock(&M); 
    sleep(1); 
    } 
    pthread_exit(0); 
} 

void *codice_Th2(void *arg) { 
    int i; 
    for (i=0; i<10;i++){ 
    pthread_mutex_lock(&M); 
    printf("Thread %s: ", (char *)arg); 
    A--; 
    printf("A = %d \n", A); 
    pthread_mutex_unlock(&M); 
    sleep(1); 
    } 
    pthread_exit(0); 
} 

main()简单地创建线程,并与线1和2

int main(){ 
    pthread_t th1, th2; 
    ... 
} 

让我困扰的加盟为主线,是我得到以下输出

Thread th1: Thread th2: A = 11 
A = 10 
Thread th1: A = 11 
Thread th2: A = 10 
Thread th1: Thread th2: A = 11 
A = 10 
Thread th1: Thread th2: A = 11 
A = 10 
Thread th2: Thread th1: A = 9 
A = 10 
Thread th1: A = 11 
Thread th2: A = 10 

而我希望每行都按顺序执行printf语句,因为它们在互斥体中。

换句话说,我无法理解的输出中

Thread th2: Thread th1: A = 9 

我总是会想到类似

Thread NAME: A = VALUE 

东西难道我失去了一些东西?

回答

2

没关系,我相信我发现了这个问题。在使用之前,我没有使用pthread_mutex_init(&M, NULL);初始化互斥锁。

设置

int main(){ 
    pthread_t th1, th2; 
    int ret; 

    pthread_mutex_init(&M, NULL); 

固定的问题。我假设使用pthread_mutex_init是一个要求。不幸的是,跳过互斥体初始化不会产生任何警告或错误。脚本默默编译。

+2

将来包括你的'main'函数的全部(或至少相关的部分),所以我们也可以找到这些错误:) – 2015-02-06 21:36:33

+0

@Daniel你是绝对正确的。我错误地认为'main()'很简单,不值得张贴。 – 2015-02-06 21:37:27

+0

它不能在编译时产生警告或错误......你的编译器如何知道这个函数应该被调用?它会如何找到它是否真的被称为?请记住,不初始化变量是C中一个非常常见的错误,它不是被禁止的。使用它们就是UB。这正是你的互斥体发生的事情。 – 2015-02-06 21:43:36