我在使用pthreads程序時發生偶然性崩潰,可能與線程在數據上的運行方式有關,因此我有一些關於如何使用線程和內存佈局進行編程的基本問題:如何使用C++&Pthreads安全地操作線程中的參數?
假設公共類函數對某些字符串執行某些操作,並將結果作爲字符串返回。該函數的原型可能是這樣的:
std::string SomeClass::somefunc(const std::string &strOne, const std::string &strTwo)
{
//Error checking of strings have been omitted
std::string result = strOne.substr(0,5) + strTwo.substr(0,5);
return result;
}
- 它是正確的假設,字符串,是動態的,存儲在堆上,但是這個字符串的引用堆棧在運行時分配?
堆棧:[某些MEM地址]指針地址 到該字符串是在堆上
堆:分配用於其 可以增大或縮小初始串[部份MEM地址]存儲器
爲了使函數線程安全的,功能與下面的互斥體(被聲明爲私有的「SomeClass的」)延長鎖定:
std::string SomeClass::somefunc(const std::string &strOne, const std::string &strTwo)
{
pthread_mutex_lock(&someclasslock);
//Error checking of strings have been omitted
std::string result = strOne.substr(0,5) + strTwo.substr(0,5);
pthread_mutex_unlock(&someclasslock);
return result;
}
這是鎖定向下字符串(三個)正在進行的操作的安全的方式,或者可能一個線程調度器在下列情況下被停止,這我會假設會弄亂預期的邏輯:
a。調用該函數之後,參數strOne & strTwo已在函數在堆棧中的兩個引用指針中設置,調度程序爲該線程取消處理時間,並讓新線程進入,從而覆蓋該引用指向函數的指針,然後再由調度程序停止,讓第一個線程回來?
b。可以在相同的發生與「結果」的字符串:第一個字符串構建的結果,解鎖互斥量,但在此之前返回調度在另一個線程執行它的所有工作,覆蓋結果讓等
是在線程這樣做,和「返回」的結果的安全/正確的方式,傳遞給將要填充的結果,而不是一個字符串的引用:
空隙SomeClass的:: somefunc(常量的std :: string & strOne,常量的std :: string & strTwo,的std :: string結果) { 的pthread_mutex_lock(& someclasslock);
//錯誤檢查字符串已被省略 result = strOne.substr(0,5)+ strTwo。SUBSTR(0,5);
pthread_mutex_unlock(& someclasslock); }
或者當另一個線程正在執行它的任務時,引用參數/結果字符串被壓入堆棧?
預定邏輯的是,「SomeClass的」類的多個對象創建新線程並作爲參數傳遞本身的對象,然後調用函數:「someFunc」:
int SomeClass::startNewThread()
{
pthread_attr_t attr;
pthread_t pThreadID;
if(pthread_attr_init(&attr) != 0)
return -1;
if(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0)
return -2;
if(pthread_create(&pThreadID, &attr, proxyThreadFunc, this) != 0)
return -3;
if(pthread_attr_destroy(&attr) != 0)
return -4;
return 0;
}
void* proxyThreadFunc(void* someClassObjPtr)
{
return static_cast<SomeClass*> (someClassObjPtr)->somefunc("long string","long string");
}
對不起,很長的描述。但我希望問題和預期目的是明確的,如果不讓我知道,我會詳細說明。
此致敬禮。 Chris
謝謝你們兩位抽出時間回覆。 – ChrisCphDK 2010-06-11 08:05:01