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



相關文章
相關標籤/搜索