2013-06-30 18 views
0

我正在使用pthread_create和mutexes使用线程,但我注意到在我的简单示例中,存储在传递给pthread_create的结构中的int值在线程执行方法时不保留其值SimpleThread。以下是代码。具体来说,在第63行中,我将循环中的count指定给用作pthread_create中参数的struct线程中的int id。在第22行中,我从结构中打印出id的值,它总是给出相同的值。如果我创建2个线程,则值为2.如果我创建3个线程,则值为3.该模式将继续。我想我只是好奇,为什么发生这种情况得到实际的价值,而不是我喜欢我打算线63传入pthread_create的值已更改

1 #include <stdio.h> 
2 #include <stdlib.h> 
3 #include <pthread.h> 
4 #include <unistd.h> 
5 
6 #define PROGRAM_NAME 0 
7 #define NUM_THREADS 1 
8 
9 int SharedVariable; 
10 pthread_mutex_t mutex; 
11 
12 struct thread 
13 { 
14  pthread_t t; 
15  int id; 
16 }; 
17 
18 void* SimpleThread(void* arg) 
19 { 
20  struct thread* parameter = (struct thread*) arg; 
21  int which = parameter->id; 
22  printf("Threads IDs in SimpleThread -- %d\n", parameter->id); 
23 
24  pthread_mutex_lock(&mutex); 
25 
26  int num, val; 
27 
28  for(num = 0; num < 20; num++) 
29  { 
30  if(random() > RAND_MAX/2) 
31   usleep(10); 
32 
33  val = SharedVariable; 
34 
35  //printf("***thread %d sees value %d\n", which, val); 
36  SharedVariable = val + 1; 
37  } 
38 
39  val = SharedVariable; 
40  //printf("Thread %d sees final value %d\n", which, val); 
41 
42  pthread_mutex_unlock(&mutex); 
43 
44  return (void *) arg; 
45 } 
46 
47 int main(int argc, char* argv[ ]) 
48 { 
49  int num_threads, i; 
50 
51  if(argc != 2) 
52  { 
53  fprintf(stderr, "Usage: %s <num_threads>\n", argv[ PROGRAM_NAME ]); 
54  return -1; 
55  } 
56  num_threads = atoi(argv[ NUM_THREADS ]); 
57  struct thread* container = (struct thread*) malloc(num_threads * sizeof(struct thread)); 
58 
59  pthread_mutex_init(&mutex, NULL); 
60 
61  for(i = 0; i < num_threads; i++) 
62  { 
63  container[ i ].id = i; 
64  pthread_create(&container[ i ].t, 0, SimpleThread, &container); 
65  } 
66 
67  for(i = 0; i < num_threads; i++) 
68  { 
69  pthread_join(container[ i ].t, 0); 
70  } 
71 
72  pthread_mutex_destroy(&mutex); 
73 
74  return 0; 
75 } 
+0

'结构螺纹*参数=(结构螺纹*)ARG;',然后'结构螺纹*容器=(结构螺纹* )malloc' - *** AAAAAAAAARRRRRGGGGHHHH!*** – 2013-06-30 20:16:42

+0

不要投malloc也。 –

+0

我试图删除malloc,但输出后出现分段错误。这是我的理解,主函数中的malloc初始化结构,然后我使用初始化的结构作为SimpleThread函数中的参数。 – wmarquez

回答

3

您没有将正确的数组元素传递到您的线程中。

而不是

pthread_create(&container[ i ].t, 0, SimpleThread, &container) 

你需要这样做

pthread_create(&container[ i ].t, 0, SimpleThread, &container[i]) 
+0

谢谢!!!我不敢相信这是一个简单的修复。 – wmarquez

1

你给作为参数相同的地址,以2个不同的线程。以这种方式使它成为共享资源。