多執行緒程式設計時應警惕release 編譯模式

2021-10-03 07:15:03 字數 1304 閱讀 4802

目錄原理

示例 解決

visual studio 提供兩種模式來編譯c++**:debug和release.

release 模式下,編譯器會「優化」**,把它認為可以簡化的邏輯簡化掉。比如說以下**:

void func()

}

編譯器看到 i 賦值給 j,而且後來的語句裡 i  j 的值不再變化,於是編譯器將以上**簡化為:

void func()

}

假如i 和 j 只是區域性變數,不受其他執行緒的操作,那麼這樣的簡化是沒有問題的。但是假如我們進行多執行緒程式設計,而且 i j 可以被多個執行緒操作,則以上簡化會帶來很大的問題。

以下面的**作為簡單的例子來說明:

#include "thrd.h"

thrd::thrd(qobject *parent) : qthread(parent)

void thrd::run(void)

}void thrd::vstart(void)

}void thrd::vstop(void)

}

#include "mainwindow.h"

#include "ui_mainwindow.h"

mainwindow::mainwindow(qwidget *parent) :

qmainwindow(parent),

ui(new ui::mainwindow)

mainwindow::~mainwindow()

void mainwindow::on_pushbutton_clicked()

void mainwindow::on_pushbutton_2_clicked()

在release模式下編譯之後,啟動執行緒(呼叫vstart()函式),程式將陷入死迴圈!原因在前面已經闡述了。

同樣的**在debug模式下是不會死迴圈的。因為vstart()函式沒有被「優化」。在while(m_icount == itmp){}等待之時,子執行緒也開始執行(run()函式),並且改變了m_icount的取值,使得while(m_icount == itmp)迴圈得以跳出。

假如專案要求我們必須在release模式下編譯,而且我們需要多執行緒,該如何處理?

在專案屬性頁選擇c\c++ > 優化 > 優化 > 已禁用(\od)即可

多執行緒程式設計時執行緒的喚醒方式

執行緒a和執行緒b,執行緒b可以認為消費者,而執行緒a可以認為生產者。執行緒b沒有任務時便會睡 眠。執行緒a有兩種方式喚醒執行緒b 1.condition variable,即執行緒b wait乙個condition variable,而執行緒a負責對這個co ndition呼叫notify 來喚醒...

多執行緒程式設計

1 多執行緒的基本思路不是在介面執行緒執行費時的 而是專門啟動乙個執行緒 稱作工作執行緒 來完成,介面執行緒只負責介面的 顯示 和操作,而工作執行緒只負責耗時的操作過程。2 對於普通的win32應用程式來說,執行緒可以分為兩種 介面 ui user inte ce 執行緒和工作執行緒。介面執行緒一般...

多執行緒程式設計

如何編寫執行緒安全的dll 在我的工作中經常會編寫dll,這些dll有個共同的特點就是都有乙個初始化函式,乙個資源釋放函式,其他幾個函式都是核心功能函式。而且這些dll有時會被多個程序同時呼叫,這就牽扯到多程序的多執行緒呼叫dll的問題。有點繞口,以下我根據我實踐中遇到的問題,分四種情況分享一下我解...