簡體   English   中英

以某種方式在 C++ 中錯誤地使用互斥鎖

[英]Using mutex locks incorrectly in C++ somehow

我有以下代碼可以嘗試(但失敗)來保護我的代碼中的關鍵區域。 基本上,我希望在其他線程打印另一條語句之前,任何線程都可以完全執行打印語句。

main.h

pthread_mutex_t printer_mutex;

main.c - 程序做的第一件事:

pthread_mutex_init(&printer_mutex, NULL);

線程是這樣創建的(盡管我已經刪除了一些檢查):

for(long t = 0; t < NUM_THREADS; t++) {
   args[t].fw = fw;
   args[t].deriv_init = deriv_init;
   args[t].to_prove = fw.to_prove.at(i);
   pthread_create(&threads[t], NULL, do_derivation_helper, (void *) &args[t]);
}
for(long t = 0; t < NUM_THREADS; t++) {
  pthread_join(threads[t], NULL);
}

然后在我的 class 中執行程序中的所有打印,我有以下內容。 打印應鎖定,然后在完成后解鎖。

void InfoViewer::rule_x_fires() {
    // START CRITICAL REGION
    pthread_mutex_lock(&printer_mutex);
    cout << "INFO: Rule x fires" << endl;
    pthread_mutex_unlock(&printer_mutex);
    // END CRITICAL REGION
}

我得到的不受歡迎的 output 是:

INFO: Rule x firesINFO: Rule x fires

即在其他線程開始打印之前,該行沒有結束。

有任何想法嗎? 我沒有正確初始化嗎? 我可以在我的 C++ 程序中使用標准 C 樣式的線程嗎?

我相信問題在於在 header 文件中定義互斥變量。 這樣,每個編譯單元都會獲得自己的此類變量版本,而您只需鎖定不同的互斥鎖。 只需這樣做:

// .h header file: declare
extern pthread_mutex_t printer_mutex;

// one of the .c/.cpp files: define
pthread_mutex_t printer_mutex;

編輯0:

為了解釋為什么它使用多個定義“工作” - PThread 互斥鎖可以用兩種不同的方式初始化 - 使用pthread_mutex_init動態初始化,使用PTHREAD_MUTEX_INITIALIZER靜態初始化。 查看pthread.h可以找到以下內容(32 位版本):

# define PTHREAD_MUTEX_INITIALIZER \
    { { 0, 0, 0, 0, 0, { 0 } } }

這意味着由於 static ZCD69B4957F06CD818D7BF3D61980E2 是零填充的事實,任何類型為pthread_mutex_t的 static 變量都將被正確初始化,而無需分配任何顯式值或初始化調用。 因此,您顯式地動態初始化了一個互斥鎖,所有其他互斥鎖都被隱式初始化為全零。

您始終可以將std::cout的使用更改為printf() 您在 Mac 上,這是一個 POSIX 兼容的操作系統。 printf()保證是原子的。 實際上,如果您可以使用printf以便一次生成的所有 output 由單個printf()調用執行,那么您甚至不需要互斥鎖。 std::cout沒有任何保證。 沒有任何。

如果您確實將std::cout的這種特殊用途轉換為printf您應該在整個應用程序中這樣做。 混合std::coutprintf並不是最好的主意。

這是一個有趣的問題。 我不認為這解決了根本問題(ostream 中的同步),但試試這個:

void InfoViewer::rule_x_fires() {
    // START CRITICAL REGION
    pthread_mutex_lock(&printer_mutex);
    cout << "INFO: Rule x fires" << endl;
    cout.flush();
    pthread_mutex_unlock(&printer_mutex);
    // END CRITICAL REGION
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM