volatile不能保证线程安全
Posted yml435
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了volatile不能保证线程安全相关的知识,希望对你有一定的参考价值。
在dpdk中,由于封装了原子量的操作。如
typedefstruct{
volatileint32_t cnt;/**< An internal counter value. */
}rte_atomic32_t;
但是很多人在使用的时候,经常如下使用
rte_atomic32_t pkt_count;
pkt_count.cnt +=......
这样在多线程中其实是很不安全的。
例子:
#include<pthread.h>
#include<stdio.h>
volatileint test=0;
//pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
void* print_xs (void* used)
{
//pthread_rwlock_wrlock(&rwlock);
test=test+2;
//pthread_rwlock_unlock(&rwlock);
sleep(1);
//pthread_rwlock_wrlock(&rwlock);
test=test+3;
//pthread_rwlock_unlock(&rwlock);
}
int main (){
pthread_t thread_id[100];
int data=0;
int i=0;
for(i=0; i<100; i++){
pthread_create (&(thread_id[i]), NULL, print_xs, NULL);
}
for(i=0; i<100; i++){
pthread_join(thread_id[i],NULL);
}
printf("%d\n",test);
return-1;
}
测试代码如上,定义了volatile ,在不加锁的情况下执行。
执行结果比较随机,都不是500。
摘抄一段维基百科的话:
在程序设计中,尤其是在C语言、C++、C#和Java语言中,使用volatile关键字声明的变量或对象通常具有与优化、多线程相关的特殊属性。通常,volatile关键字用来阻止(伪)编译器认为的无法“被代码本身”改变的代码(变量/对象)进行优化。如在C语言中,volatile关键字可以用来提醒编译器它后面所定义的变量随时有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
以上是关于volatile不能保证线程安全的主要内容,如果未能解决你的问题,请参考以下文章