我正在使用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 }
'结构螺纹*参数=(结构螺纹*)ARG;',然后'结构螺纹*容器=(结构螺纹* )malloc' - *** AAAAAAAAARRRRRGGGGHHHH!*** – 2013-06-30 20:16:42
不要投malloc也。 –
我试图删除malloc,但输出后出现分段错误。这是我的理解,主函数中的malloc初始化结构,然后我使用初始化的结构作为SimpleThread函数中的参数。 – wmarquez