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
东西难道我失去了一些东西?
将来包括你的'main'函数的全部(或至少相关的部分),所以我们也可以找到这些错误:) – 2015-02-06 21:36:33
@Daniel你是绝对正确的。我错误地认为'main()'很简单,不值得张贴。 – 2015-02-06 21:37:27
它不能在编译时产生警告或错误......你的编译器如何知道这个函数应该被调用?它会如何找到它是否真的被称为?请记住,不初始化变量是C中一个非常常见的错误,它不是被禁止的。使用它们就是UB。这正是你的互斥体发生的事情。 – 2015-02-06 21:43:36