- 论坛徽章:
- 0
|
本帖最后由 crazyhadoop 于 2011-09-20 18:13 编辑
以前被问过一个多线程环境中的static变量问题,到现在一直没搞明白,
今天写了一小段代码,但解释不清,大家帮忙看看吧
multiThread_staticVar.c- #include <stdio.h>
- #include <pthread.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/syscall.h>
- #define INIT 1
- #define MAX 10
- //static int v = INIT;
- void *f (void *arg)
- {
- static int v = INIT;
- printf("Thread ID = %ld, arg = %d, v = %d\n", syscall(SYS_gettid), *(int *)arg, v);
- while (v < MAX) {
- v += *(int *)arg;
- // printf("v = %d\n", v);
- printf("Thread ID = %ld, arg = %d, v = %d\n", syscall(SYS_gettid), *(int *)arg, v);
- sleep(1);
- }
- return NULL;
- }
- int main (int argc, char const *argv[])
- {
- pthread_t t1, t2;
- int a = 2, b = 1;
- pthread_create(&t1, NULL, f, &a);
- pthread_create(&t2, NULL, f, &b);
- pthread_join(t1, NULL);
- pthread_join(t2, NULL);
- return 0;
- }
复制代码 程序运行的结果如下- ~$ ./multiThread_staticVar
- Thread ID = 3467, arg = 2, v = 1
- Thread ID = 3467, arg = 2, v = 3
- Thread ID = 3468, arg = 1, v = 1
- Thread ID = 3468, arg = 1, v = 4
- Thread ID = 3467, arg = 2, v = 6
- Thread ID = 3468, arg = 1, v = 7
- Thread ID = 3467, arg = 2, v = 9
- Thread ID = 3468, arg = 1, v = 10
复制代码 可以看到,线程3467中static变量v被初始化为1,然后加上了2,变为3,然后sleep,线程3468开始执行,这时打印的v的值还是1,但执行即v += 1;后v的值变为4,则v的值变化之前是3,即线程3467 sleep时的值,这里我不理解:当线程3468开始执行f()的时候,v的值应该已经是3,但打印出来是1,但执行却变为4,这明明又是在线程3467的执行结果上加了1,为什么?还有,v是static变量,应该只初始化一次,但线程3468开始执行f()时v的值是1,即为其初始化的值,请各位朋友看看
多线程并发取数据竞争。 |
|