#include #include #include #include #include #define thread_count 10
void *thread_callback(void *arg)
}int main() ;
int i = 0;
int count = 0;
for (i = 0; i < thread_count; i++)
for(i = 0; i < 100; i++)
}
十個執行緒同時對count自行自增十萬次,結果count並不是十萬。
原因如下:
1、取count
2、自增
3、將count放回
在理想情況中不同執行緒會乙個執行緒執行完,執行緒切換,另乙個執行緒再接著執行。但是也有不理想的情況:
執行緒m取count,這時進行執行緒切換,執行緒n也取count。這時count_m和count_n是相等的,他們自增後再放回,雖然自增了兩次,但實際上count只增加了1
所以需要對臨界資源加鎖。
#include #include #include #include #include #define thread_count 10
pthread_mutex_t mutex; // 宣告全域性變數mutex
void *thread_callback(void *arg)
}int main() ;
pthread_mutex_init(&mutex, null); // 初始化mutex
int i = 0;
int count = 0;
for (i = 0; i < thread_count; i++)
for(i = 0; i < 100; i++)
}
#include #include #include #include #include #define thread_count 10
pthread_mutex_t mutex;
pthread_spinlock_t spinlock; // 這裡不一樣
void *thread_callback(void *arg)
}int main() ;
pthread_mutex_init(&mutex, null);
pthread_spin_init(&spinlock, pthread_process_shared); // 這裡不一樣
int i = 0;
int count = 0;
for (i = 0; i < thread_count; i++)
for(i = 0; i < 100; i++)
}
寫法可以說和mutex一模一樣
自旋鎖相當於乙個while(1),當臨界資源被占用,他會不停地詢問是否可以呼叫。
互斥鎖則是如果乙個執行緒申請臨界資源發現其被占用的時候,會引起執行緒的切換,讓出cpu,等待下一次被呼叫。
分別什麼時候用?
不用鎖可以麼?
原子操作
cas --> conpare and swap --> 比較交換
無鎖佇列
if(a == b)
詳細介紹. 多執行緒程式設計 臨界區
1 windows api建立執行緒 include 包含相應標頭檔案 include dword winapi myfun1 lpvoid lpparameter 宣告執行緒函式 dword winapi myfun2 lpvoid lpparameter int main 主函式 else 如果...
多執行緒系列 競態臨界區 共享資源
在同一程式中執行多個執行緒本身不會導致問題,問題只有在一或多個執行緒向這些資源做了寫操作時才有可能發生,只要資源沒有發生變化,多個執行緒讀取相同的資源就是安全的。多執行緒同時執行下面的 可能會出錯 1publicclasscounter 6 想象下執行緒a和b同時執行同乙個counter物件的add...
Linux多執行緒臨界區問題
臨界區指的是乙個訪問共用資源 例如 共用裝置或是共用儲存器 的程式片段,而這些共用資源又無法同時被多個執行緒訪問的特性。當有執行緒進入臨界區段時,其他執行緒或是程序必須等待,有一些同步的機制必須在臨界區段的進入點與離開點實現,以確保這些共用資源是被互斥獲得使用,例如 semaphore。只能被單一執...