簡體   English   中英

在C中的兩個函數上使用pthreads

[英]Using pthreads on two functions in C

我對pthread完全陌生,在我瀏覽過的所有網站上似乎都有很多不必要的信息。

我有兩個函數,現在暫時將它們稱為X和Y,它們都在內存中的塊上工作。 如果一個線程正在運行XI,而又不希望其他任何線程在同一塊上調用X或Y,那么如何確保這種情況永遠不會發生呢?

我是否需要互斥鎖定某些塊值的功能?

您將需要使用互斥鎖。

您不應鎖定代碼,而應鎖定數據。 為每個塊創建一個互斥鎖,並在對該塊執行功能時將其鎖定,然后在完成時將其解鎖。

互斥鎖是由pthread.h pthread_mutex_t定義的類型。 提供了鎖定和解鎖互斥鎖的功能。 這些函數確保一次僅一個線程可以獲得一個鎖(如果您只是使用一個變量來指示正在使用您的塊,則該變量而不是塊將具有並發性問題)。

在線上有許多教程。 Google的“ pthread教程”,您應該找到足夠的入門知識。

使用互斥鎖鎖定資源(在本例中為內存塊)。 或者,您可以僅鎖定功能代碼中讀取/更新該內存區域的部分。 這被稱為關鍵部分,並且需要不同的編碼方式。 這意味着您的線程可以自由操作,除非它們到達與資源交互的那一部分。

第一種方法更易於實現-整個函數X或Y只需采用全有或全無的方法。

也許一些演示代碼是有序的。 假設您有一個像這樣的塊頭:

struct block {
    void *data;
    size_t len;
};

您可以通過向此結構添加互斥變量來保護該塊:

struct block {
    void *data;
    size_t len;
    pthread_mutex_t lock;
};

然后,您需要為此結構更新初始化函數以初始化鎖:

struct block *new_block(size_t len)
{
    struct block *b = malloc(sizeof *b);
    b->data = malloc(len);
    b->len = len;

    pthread_mutex_init(&b->lock, NULL);

    return b;
}

然后,X和Y函數(以及任何其他讀取或寫入該塊的函數)需要獲取該鎖並在出口處釋放它:

int x(struct block *b)
{
    int retval;

    pthread_mutex_lock(&b->lock);

    /* code */

    pthread_mutex_unlock(&b->lock);
    return retval;
}

int y(struct block *b)
{
    int retval;

    pthread_mutex_lock(&b->lock);

    /* code */

    pthread_mutex_unlock(&b->lock);
    return retval;
}

您還需要注意即使在錯誤返回路徑中也要解鎖互斥鎖。

使用高級語言確實可以更好地解決多線程編程問題。 有些事情用C語言很難理解,我認為,多線程是其中之一。 我發現Java使我對這些問題有了更好的了解。 它使概念更容易理解,文檔也更容易閱讀。 如果您不喜歡Java,那么Poco或Qt之類的C ++框架也會更好。

正如其他人所說,從概念上講,您想鎖定資源(在您的情況下為一部分內存)。 作為一個概念,信號量比互斥量更適合解決此問題。 我會研究信號量,而只是將互斥鎖視為信號量的構建塊。 如果您問我,互斥鎖是一個名稱不正確的二進制信號量。

暫無
暫無

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

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