باگ درپاس دادن متغیر با رفرنس به thread - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

باگ درپاس دادن متغیر با رفرنس به thread

+2 امتیاز

سلام.امروز من داشتم با thread کار میکردم به یک مشکل اساسی برخوردم یک متغیر را به صورت reference به thread پاس دادم و داخل thread تغییرش میدم ولی در main هیچ تغییری دیده نمیشه .اشکال از کجاست ؟


#include <iostream>;
#include <chrono>;
#include <thread>;
using namespace std;

void test(int& counter){
	std::this_thread::sleep_for(chrono::milliseconds(500));
	counter++;
	cout << "thread counter: " << counter << endl;

}
int main(){
	cout << "start" << endl;
	int counter = 0;
	std::thread a(test, counter);
	a.join();
	
	cout << "main thread counter:" << counter << endl;
	return 0;
}

 

سوال شده دی 5, 1393  بوسیله ی hojat1 (امتیاز 875)   12 69 99
ویرایش شده دی 5, 1393 بوسیله ی hojat1

2 پاسخ

+2 امتیاز
 
بهترین پاسخ

چون counter به صورت رفرنس پاس داده نمیشه و در واقع کپی میشه به همین خاطر تغییرات اعمال نمیشه برای اینکار باید از std::ref استفاده کنید.

std::thread a(test, std::ref(counter));

البته این سوال قبلا در اینجا مطرح شده بود.

پاسخ داده شده دی 5, 1393 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
انتخاب شد دی 7, 1393 بوسیله ی hojat1
0 امتیاز

مثل باغلوا کار میکنه

#include <iostream>
#include <chrono>
#include <thread>
using namespace std;

void test(int * counter){
    std::this_thread::sleep_for(chrono::milliseconds(1000));
    (*counter)++;
    cout << "thread counter: " << *counter << endl;

}
int main(){
    cout << "start" << endl;
    int counter = 0;
    while(1){
            std::thread a(test, &counter);
            a.join();
            if (counter==10)return 0;
    }

    cout << "main thread counter:" << counter << endl;
    return 0;
}

 

پاسخ داده شده دی 5, 1393 بوسیله ی Fire360Boy (امتیاز 2,524)   6 24 43
دوست عزیز با اشاره گر را خودمم هم می دونستم که درست کار میکنه خوبه در عنوان سوال هم کلمه رفرنس را استفاده کردم.هدف از سوالم اینه که چرا با وجود پاس دادن رفرنس کار نمیکنه.
...