2012-10-17 63 views
-1

我創建了兩個線程,並使用互斥鎖來同步它們。
在主窗口程序(我認爲是主線程)中創建另一個線程,我必須在至少兩個函數中使用互斥鎖,因爲當用戶選擇一個接口時,菜單並且配置數據,並且還有一個計時器每秒運行1次並且觸發一個插槽功能,其中讀取數據。使用互斥量後程序仍然崩潰(我可以在同一線程中使用互斥量嗎?)

我的程序經常甚至我使用互斥鎖。在「主線程」中有不同的功能,它們具有互斥鎖的鎖定和解鎖操作,其中一個功能是鏈接到定時器的插槽。另外另一個線程連續寫入數據

我很困惑,爲什麼?
(:)我真的需要一個更好的手機這時候:)之前編輯我的問題)

我的代碼:
在螺紋:

class Background : public QThread 
{ 
    Q_OBJECT 

public: 
    void Background::run(void) 
    { 
     initFile(); 

     while(1) 
     { 

      Mutex->lock(); 
      msleep(40); 
      rcv();   //writes map here 
      Mutex->unlock(); 

     } 

    } 
... 
} 

在線程的RCV():

void Background::rcv() 
{ 
    DEVMAP::iterator dev_r; 

    for(dev_r= DevMap.begin(); dev_r!= DevMap.end(); dev_r++)//DevMap is a refrence to the dev_map in mainwindow. 
    { 
     ... ....//writes the map 

    } 
} 

在主窗口:

void MainWindow::initTimer() 
{ 
    refreshTimer = new QTimer(this); 
    connect(refreshTimer, SIGNAL(timeout()), this, SLOT(refreshLogDisplay())); 
    refreshTimer->start(1000); 
} 

void MainWindow::refreshLogDisplay() 
{ 

//MUTEX 
    mutex->lock(); 

    ......//read the map 

//MUTEX 
    mutex->unlock(); 

} 

在線程的建設:

Background(DEVMap& map,...,QMutex* mutex):DevMap(map)...,Mutex(mutex){} 

在主窗口它創建線程:

void MainWindow::initThread() 
{ 


    mutex = new QMutex; 
    back = new Background(dev_map,..., mutex); 
    back->start(); 

} 

和:

void MainWindow::on_Create_triggered()//this function is a slot triggered by a menu item in the MainWindow UI 
{ 

    ......//get information from a dialog 


//MUTEX 

    mutex->lock(); 

    BitState* bitState = new BitState(string((const char *)dlg->getName().toLocal8Bit()), 
             string((const char *)dlg->getNO().toLocal8Bit()), 
             dlg->getRevPortNo().toInt(), dlg->getSndPortNo().toInt()); 


    dev_map.insert(DEVMAP::value_type (string((const char *)dlg->getPIN().toLocal8Bit()), *bitState)); 
    //writes map here 



//MUTEX 
    mutex->unlock(); 


} 
+2

請花時間好好寫。你不會喜歡這種風格的明顯衝突和寫作的答案,所以在提問時表現出相同的禮貌。 – Jon

+0

謝謝,我編輯了它。 – Al2O3

回答

1

您可以在任何線程使用互斥。它是爲此目的而設計的。但是你不應該創建死鎖,例如,如果你'嵌套'調用'鎖'。

好:

mutex->lock(); 
//code 
mutex->unlock(); 
//code 
mutex->lock(); 
//code 
mutex->unlock(); 

壞:

mutex->lock(); 
//code 
mutex->lock(); //dead lock 
//code 
mutex->unlock(); 
//code 
mutex->unlock(); 

函數使用鎖時是準確的:

void foo() 
{ 
mutex->lock(); 
//code 
mutex->unlock(); 
} 

mutex->lock(); 
foo(); //dead lock 
mutex->unlock() 

你也需要鎖定爲更少的代碼越好。將睡眠()放在鎖內並不是一個好主意,因爲其他線程在睡眠時會等待。

不好:

while(1) 
{ 
    Mutex->lock(); 
    msleep(40); 
    rcv(); 
    Mutex->unlock(); 
} 

更好:

while(1) 
{ 
    msleep(40); 
    Mutex->lock(); 
    rcv(); 
    Mutex->unlock(); 
} 
+1

原始問題是:「我可以在同一線程中使用互斥鎖嗎」 – ChatCloud

+0

是的,我只是問:'這裏是否有任何問題:在thread_1:fun_1(){mutex-> lock; ... mutex-> unlock;},fun_2(){mutex-> lock; ...互斥 - >解鎖;};在thread_2中:while(1){msleep(40); mutex->鎖; ......; mutex->解鎖;}「。 – Al2O3