我想創建 2 個執行緒,它們正在使用一個全域變數,我的代碼:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
int var = 0; //
pthread_t threads[2];
void* function(){
if(var % 2==0){
var =2;
}
printf("Addresse %d with var %d\n", &var, var);
}
int main() {
for(int i = 0; i < 2; i ){
pthread_create(&threads[i], NULL, &function, NULL);
}
pthread_exit(NULL);
}
我用 for 回圈創建了 2 個執行緒。我想讓兩個執行緒都使用全域變數。一個應該增加 2,另一個執行緒應該乘以 2。我用 printf 看到,兩者都使用相同的地址,但輸出不同。如何讓每個執行緒執行不同的任務?
uj5u.com熱心網友回復:
如何讓每個執行緒執行不同的任務?
一種方法是為每個執行緒撰寫一個單獨的執行緒函式。在這種情況下,通過自己的pthread_create()呼叫而不是使用回圈來啟動每個會更容易。
如果您必須使用相同的執行緒函式,但您希望它在兩種情況下做不同的作業,那么最簡單的方法是使用執行緒函式的引數(您的代碼未能宣告)。例如:
void *function(void *arg) {
if ((intptr_t) arg == 0) {
// do one thing ...
} else {
// do a different thing ...
}
return /* something */;
}
int main(void) {
// ...
for(intptr_t i = 0; i < 2; i ) {
pthread_create(&threads[i], NULL, &function, (void *) i);
}
// ...
}
但是還要注意,如果您的執行緒都訪問同一個非原子全域變數,并且其中至少有一個修改了它,那么您必須同步它們的訪問,以便它們不能同時訪問它。有幾種方法可以做到這一點,但最常規的是提供一個互斥鎖,每個執行緒在訪問變數之前鎖定該互斥鎖并在之后解鎖。
uj5u.com熱心網友回復:
在多個執行緒之間安全共享變數的最簡單方法是使用互斥鎖(MUTual EXclusion)。我修改了你的程式以使用一個。請注意,它會鎖定變數被檢查和修改的區域。雖然互斥鎖對于此類應用程式來說很簡單,但其他可能涉及等待 avar具有特定值的應用程式將需要諸如條件變數 (pthread_cond_t) 之類的東西。這是針對不同需求的豐富選擇領域;但這應該讓你開始:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
int var = 0; //
pthread_mutex_t varlock = PTHREAD_MUTEX_INITIALIZER;
#define NTH 20
pthread_t threads[NTH];
void* function(){
int val;
pthread_mutex_lock(&varlock);
if(var % 2==0){
var =2;
}
val = var;
pthread_mutex_unlock(&varlock);
printf("Addresse %d with var %d\n", &var, val);
}
int main() {
for(int i = 0; i < NTH; i ){
pthread_create(&threads[i], NULL, &function, NULL);
}
pthread_exit(NULL);
}
uj5u.com熱心網友回復:
您應該參考什么是競爭條件?. 這是多執行緒競爭條件的典型示例,其中兩個執行緒正在讀取和寫入相同的記憶體地址。
編輯:您還將相同的函式作為起點傳遞給兩個執行緒。他們都檢查值是否為偶數,如果是,則將值加二。
如果您希望一個執行緒添加而另一個執行緒乘以該值,那么您可以使用兩個函式(我也使用 mevets 推薦用于同步的互斥變數)。無論哪種方式,您的代碼都將是不確定的
void* add(){
int val;
pthread_mutex_lock(&varlock);
if(var % 2==0){
var =2;
}
val = var;
pthread_mutex_unlock(&varlock);
printf("Addresse %d with var %d\n", &var, val);
}
void* multiply(){
int val;
pthread_mutex_lock(&varlock);
if(var % 2==0){
var *=2;
}
val = var;
pthread_mutex_unlock(&varlock);
printf("Addresse %d with var %d\n", &var, val);
}
int main(){
pthread_create(&threads[0], NULL, &add, NULL);
pthread_create(&threads[1], NULL, &multiply, NULL);
pthread_exit(NULL);
}
每次運行此代碼時,您可能會得到不同的輸出,因為它是不確定的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/354849.html
