在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關鍵字,則編譯器可能優化讀取和存儲,可能暫時使用寄存器中的值,若是這個變量由別的程序更新了的話,將出現不一致的現象。