C 带有pthread函数的静态存储
我在练习一些多线程程序,但我无法理解这个输出背后的逻辑C 带有pthread函数的静态存储,c,linux,pthreads,C,Linux,Pthreads,我在练习一些多线程程序,但我无法理解这个输出背后的逻辑 #include<stdio.h> #include<stdlib.h> #include<pthread.h> int print_message(void* ptr); int main() { pthread_t thread1,thread2; char *mesg1 = "Thread 1"; char *mesg2 = "Thread 2"; int iret1, iret2; pth
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
int print_message(void* ptr);
int main()
{
pthread_t thread1,thread2;
char *mesg1 = "Thread 1";
char *mesg2 = "Thread 2";
int iret1, iret2;
pthread_create(&thread1, NULL, print_message, (void *)mesg1);
pthread_create(&thread2, NULL, print_message, (void *)mesg2);
pthread_join(thread1,(void*)&iret1 );
pthread_join(thread2, (void*)&iret2);
printf("Thread 1 return : %d\n", (int)iret1);
printf("Thread 2 return : %d\n", (int)iret2);
return 0;
}
int print_message(void *ptr)
{
char *mesg;
static int i=0;
mesg = (char *)ptr;
printf("%s\n",mesg);
i++;
return ((void*)i);
}
但是我得到了输出
Thread 1
Thread 2
Thread 1 return : 1
Thread 2 return : 2
Thread 1
Thread 2
Thread 1 return : 0
Thread 2 return : 2
请一些人向我澄清一下好吗?请指出在使用pthread函数时是否有任何错误。有几本关于多线程的好书。我觉得很有趣,但最近有一些书 你也可以在线阅读 基本上,每个程序源代码线程可能不像您期望的那样直观地查看内存(,) 实际上,对线程之间共享的数据的任何访问都应该受到原语的保护,例如or
另外,请注意,调试多线程程序是一项挑战,因为它是非确定性的。变量
i
在两个线程之间共享,因为它是静态的。在多个线程之间修改变量的行为是未定义的,因此,实际上,您得到的输出和您想要得到的输出都是“错误的”,因为编译器没有义务将其提供给您。事实上,我能够让输出根据我使用的优化级别而变化,这无疑会因平台而异
如果要修改i
,应使用互斥锁:
int print_message(void *ptr)
{
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
char *mesg;
static int i=0;
int local_i;
mesg = (char *)ptr;
printf("%s\n",mesg);
if (pthread_mutex_lock(&mutex) == 0) {
local_i = ++i;
pthread_mutex_unlock(&mutex);
}
return ((void*)local_i);
}
如果不使用互斥,则永远无法确保获得您认为应该得到的输出