我正在玩一个相当简单的C示例。该程序创建两个线程并并行启动它们。每个线程都设计为使用Mutex修改全局变量,并打印出值。
#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
我错过了什么吗?
答案 0 :(得分:2)
没关系,我相信我发现了这个问题。在使用之前,我没有使用pthread_mutex_init(&M, NULL);
初始化互斥锁。
设置
int main(){
pthread_t th1, th2;
int ret;
pthread_mutex_init(&M, NULL);
解决了这个问题。我认为使用pthread_mutex_init
是必需的。不幸的是,跳过互斥锁初始化没有产生任何警告或错误。该脚本默默编译。