volatile不能保证线程安全

it2025-12-31  19


在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;} 测试代码如上,定义了 v olatile ,在不加锁的情况下执行。 执行结果比较随机,都不是500。   摘抄一段 维基百科的话: 程序设计 中,尤其是在 C语言 C++ C# Java 语言中,使用volatile关键字声明的 变量 对象 通常具有与优化、多线程相关的特殊属性。通常, volatile 关键字用来阻止(伪)编译器认为的无法“被代码本身”改变的代码(变量/对象)进行优化。如在C语言中, volatile 关键字可以用来提醒编译器它后面所定义的变量随时有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象  

null

转载于:https://www.cnblogs.com/yml435/p/6485895.html

最新回复(0)