Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 带有pthread函数的静态存储_C_Linux_Pthreads - Fatal编程技术网

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);
}
如果不使用互斥,则永远无法确保获得您认为应该得到的输出