2014-01-10 40 views
0

代碼我搜索超過2小時,谷歌,但我無法找到一個回答我的問題:C++運行在二級性病線程

我用C++在Windows 8(86)(Visual Studio速成2012)

我想在進程的主線程上從我的工作者std :: thread運行一個方法。我試圖使用它們的std :: thread :: id創建兩個線程的引用,然後交換它們,但我無法創建引用。

以下方法是從我的輔助線程調用:

[..] 

void run(bool *running, thread::id _mainThreadId) 
{ 
    while(*running) 
    { 
     thread mainThread(_mainThreadId); 
     thread thisThread(this_thread::get_id()); 
     thisThread.swap(mainThread); 
     //mainThreads work: 
     [..] 
     thisThread.swap(mainThread); 
     //thisThread again 
    } 
} 

但是,當我嘗試編譯我的項目有appeares顯示構造線程(線程:: ID)不存在錯誤。

我的問題:

有沒有更好的方法在另一個線程上運行代碼? 有沒有一種方法可以使用它的id來獲取對線程的引用?

在此先感謝!

PS: 對不起,如果有語法錯誤。我來自德國。 :)

回答

1

每個線程就像一個順序運行的程序,你不能隨意跳到程序的其他部分。

你所要求的將相當於開始另一個線程,也許暫停原來的線程直到它完成,然後讓這個新的線程去做你想要的。這是因爲每個線程都有一個指令指針,可以告訴它它在哪裏。每個線程也有寄存器和堆棧等。如果你想讓一個線程做一些不同的事情,你將不得不保存所有的狀態,做你的事情,然後恢復所有的狀態。這相當於創建一個新線程(操作系統將爲您保存所有狀態)。

可能值得問一下爲什麼要在另一個線程中運行一個方法。做你要求的唯一方法就是發送另一條線索的消息「請用這些參數運行這個方法並給我結果」,但這通常是沒有意義的。如果您需要其他線程擁有的某種權限,應該可以要求操作系統授予您的線程這些權限。

+0

好的,謝謝。我認爲這將是類似的東西,但在Java中,你可以很容易地發佈代碼到主線程,所以我認爲這將是可能的在C + +中,也是:) – User

+0

@ user3183356我不完全確定你指的是什麼。據我所知,你唯一的選擇是用Java開始一個新線程,就像C++一樣。你能提供一個資源來說明你在說什麼嗎? – CrazyCasta

+0

對不起,我的意思是Android的Activity類(runOnUiThread)。自從我最後一次使用它已經有一段時間了。 – User

0

我實際上沒有得到你正在做的交換。如果你的意圖是要執行到不同的線程,它不是如何完成:

你需要在線程創建時傳遞一個函數指針。這個函數將在分離的線程中執行。如果你想等待它,你join到線程。你有沒有檢查thread文件中的例子?

0

如果你想在另一個線程上運行某些東西,你需要傳遞一些信息給另一個線程來通知另一個線程。你不能「交換」線程,希望在另一個線程上運行某些東西!

一種方法是爲您的線程設置消息隊列,您可以在其中發送作業,並且每個線程只是查看其消息隊列並處理來自該隊列的任何內容(例如,:

int main() { 
    SomeThreadEnabledQueue<std::function<bool()>> mainQueue; 
    // kick of other threads possibly passing a pointer to the queue, etc. 

    for (bool done(false); !done;) { 
     std::function<bool()> job = mainQueue.pop(); 
     done = job(); 
    } 

    // join other threads, etc. 
} 

您其他線程將然後通過添加適當的信息發送合適的消息給你的線程mainQueue()

void run(std::atomic<bool> *running, 
     SomeThreadEnabledQueue<std::function<bool()>>* queue) { 
    while(*running) 
    { 
     // do whatever 
     queue->push([=](){ /* what the other thread should do... */; return false; }); 
     // if necessary for the work to be completed, transfer a future and wait on it 
    } 
} 

上述方法肯定的作品來獲取特定線程執行的具體工作項目。不過,不管是在特定的線程上執行某個東西都是一個好主意,這是一個不同的問題。通常情況下,擁有線程池並確保某些對象一次最多隻能運行一個線程會更好。

注意,我改變了running參數,它似乎是一個指向bool這是在另一個線程改爲std::atomic<bool>:讀值不同步的另一個線程正在改變創建一個數據的比賽,因此,不確定的行爲。