- 论坛徽章:
- 0
|
最早了解到的信息是++i是原子操作,之后了解到的是当i是地址对齐(怎样的对齐?)时++i是原子操作。
这两天测试发现并非如此,至少在多线程、共享内存的多进程里不是如此(多核机器)。
哪位能给一些更精确的说法吗?谢谢。
下面给个多线程的例子:- #include <pthread.h>
- #include <stdio.h>
- #include <unistd.h>
- int n = 0;
- void *plusplus(void *p);
- int main()
- {
- int i;
- pthread_attr_t attr;
- pthread_t tid;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
- for(i = 0;i < 4;i++)
- {
- pthread_create(&tid, &attr, plusplus, NULL);
- }
- sleep(4);
- printf("%d\n",n);
- }
- void *plusplus(void *p)
- {
- int i;
- for(i = 0;i < 2000000;i++)
- {
- if(i % 500000 == 0) printf("%d\n",i);
- ++n;
- --n;
- ++n;
- }
- }
复制代码 输出:
0
0
0
0
500000
500000
1000000
500000
500000
1000000
1000000
1000000
1500000
1500000
1500000
1500000
4915519
多核问题?
给n加volatile限定也没用,volatile对多线程不起作用。只能加锁?
期待完美解答。 |
|