簡體   English   中英

PThread 問題

[英]PThread Question

我正在嘗試制作一個小線程示例。 我想要一個變量,每個線程都嘗試增加它,然后在它到達某個點時停止。 每當變量被鎖定時,我都希望打印出某種消息,例如“線程 x 試圖鎖定,但不能”,以便我知道它工作正常。 這是我第一天的編碼線程,所以請隨時在此處的代碼中指出任何不必要的內容 -

#include <iostream>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

#define NUM_THREADS 2
pthread_t threads[NUM_THREADS];
pthread_mutex_t mutexsum;

int NUMBER = 0;
void* increaseByHundred(void* threadid) {

    if(pthread_mutex_lock(&mutexsum))
        cout<<"\nTHREAD "<<(int)threadid<<" TRYING TO LOCK BUT CANNOT";

    else {
        for(int i=0;i<100;i++) {
            NUMBER++;
            cout<<"\nNUMBER: "<<NUMBER;
        }
        pthread_mutex_unlock(&mutexsum);
        pthread_exit((void*)0);
    }
}


int main(int argc, char** argv) {

    int rc;
    int rc1;
    void* status;

    pthread_attr_t attr;

    pthread_mutex_init(&mutexsum, NULL);
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

    rc = pthread_create(&threads[0], &attr, increaseByHundred, (void*)0);
    rc1 = pthread_create(&threads[1], &attr, increaseByHundred, (void*)1);

    pthread_attr_destroy(&attr);

    while(NUMBER < 400)
        pthread_join(threads[0], &status);


    pthread_mutex_destroy(&mutexsum);
    pthread_exit(NULL);

}

我正在按照此處找到的教程https://computing.llnl.gov/tutorials...reatingThreads並嘗試使他們的互斥鎖示例適應這個想法。 代碼將其增加到 199,然后停止。 我猜是因為線程只執行一次例程。 有沒有辦法讓他們只做他們的日常工作,而不是當你創建它們時,所以我可以說

而你的例行公事?

我在那里有 pthread_join 只是因為它與他們的教程相似。 不過,我什至不是很清楚。 我很確定那條線是問題所在……我只是不知道如何解決它。 任何幫助表示贊賞。

每當變量被鎖定時,我都希望打印出某種消息,例如“線程 x 試圖鎖定,但不能”,以便我知道它工作正常。

你為什么要那個? 你只是在學習線程。 首先學習基礎知識。 不要 go 從深處潛入pthread_mutex_trylock或為錯誤檢查配置的互斥鎖。 你需要先學會走路,然后才能學會跑步。

基礎知識包括使用默認設置初始化互斥鎖並使用pthread_mutex_lock來獲取鎖。 使用默認設置, pthread_mutex_lock只會在出現大問題時返回非零值。 這里只會出現兩個問題:死鎖和錯誤的互斥指針。 兩者都沒有恢復; 唯一真正的解決方案是修復代碼。 在這里你唯一能做的就是拋出一個你沒有捕獲的異常,調用 exit() 或 abort() 等。

其他一些線程鎖定了互斥鎖並不是一個大問題。 這根本不是問題。 pthread_mutex_lock將阻塞(例如,go 進入睡眠狀態)直到鎖可用。 pthread_mutex_lock返回零意味着調用線程現在擁有鎖。 只需確保在完成使用受保護的 memory 后釋放鎖。

編輯
這是一個建議,可以讓您看到線程機制正在像宣傳的那樣工作。

  1. 在進入increaseByHundred時打印一條帶時間戳的消息,指示進入 function。 您可能想在這里使用 C printf而不是 C++ I/O。 printf()和相關函數是線程安全的。 C++ 2003 I/O 不是。
  2. pthread_mutex_lock成功返回后,打印另一條指示成功鎖定的時間戳消息。
  3. sleep()幾秒鍾,然后在調用pthread_mutex_unlock()之前再打印一條帶時間戳的消息。
  4. 在調用pthread_exit()之前做同樣的事情。

最后一條評論:您正在檢查pthread_mutex_lock的錯誤返回。 為了完整起見,並且因為每個優秀的程序員都偏執,所以您還應該檢查pthread_mutex_unlock的返回狀態。

pthread_exit呢? 它沒有返回狀態。 可以在調用pthread_exit后打印一些消息,但如果您使用的是線程庫的不兼容版本,您只會到達該語句。 function pthread_exit()無法返回調用 function。 時期。 擔心pthreads_exit()返回時會發生什么是一個錫箔帽練習。 雖然優秀的程序員應該是偏執的,但他們不應該是偏執的精神分裂症。

pthread_mutex_trylock():

if (pthread_mutex_trylock(&mutex) == EBUSY) {
    cout << "OMG NO WAY ITS LOCKED" << endl;
}

還值得注意的是,如果互斥鎖沒有被鎖定,它將能夠獲得鎖,然后它的行為就像一個普通的pthread_mutex_lock()

pthread_mutex_lock 通常只會阻塞直到它獲得鎖,這就是為什么行cout<<"\nTHREAD "<<(int)threadid<<" TRYING TO LOCK BUT CANNOT"; 沒有跑。 你也有問題

while(NUMBER < 400)
     pthread_join(threads[0], &status);

因為您只有 2 個線程,並且數量永遠不會達到 400。您還想在第一次迭代時加入 thread[0],然后加入 thread[1] ...

暫無
暫無

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

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