volatile不能保证线程安全


在dpdk中,因为封装了原子量的操做。如
  1. typedefstruct{
  2. volatileint32_t cnt;/**< An internal counter value. */
  3. }rte_atomic32_t;
可是不少人在使用的时候,常常以下使用
  1. rte_atomic32_t pkt_count;
  2. pkt_count.cnt +=......
这样在多线程中实际上是很不安全的。
例子:
  1. #include<pthread.h>
  2. #include<stdio.h>
  3. volatileint test=0;
  4. //pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
  5. void* print_xs (void* used)
  6. {
  7. //pthread_rwlock_wrlock(&rwlock);
  8. test=test+2;
  9. //pthread_rwlock_unlock(&rwlock);
  10. sleep(1);
  11. //pthread_rwlock_wrlock(&rwlock);
  12. test=test+3;
  13. //pthread_rwlock_unlock(&rwlock);
  14. }
  15. int main (){
  16. pthread_t thread_id[100];
  17. int data=0;
  18. int i=0;
  19. for(i=0; i<100; i++){
  20. pthread_create (&(thread_id[i]), NULL, print_xs, NULL);
  21. }
  22. for(i=0; i<100; i++){
  23. pthread_join(thread_id[i],NULL);
  24. }
  25. printf("%d\n",test);
  26. return-1;
  27. }
测试代码如上,定义了 v olatile ,在不加锁的状况下执行。
执行结果比较随机,都不是500。
 
摘抄一段 维基百科的话:
程序设计 中,尤为是在 C语言 C++ C# Java 语言中,使用volatile关键字声明的 变量 对象 一般具备与优化、多线程相关的特殊属性。一般, volatile 关键字用来阻止(伪)编译器认为的没法“被代码自己”改变的代码(变量/对象)进行优化。如在C语言中, volatile 关键字能够用来提醒编译器它后面所定义的变量随时有可能改变,所以编译后的程序每次须要存储或读取这个变量的时候,都会直接从变量地址中读取数据。若是没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,若是这个变量由别的程序更新了的话,将出现不一致的现象
 



相关文章
相关标签/搜索