簡體   English   中英

在多線程環境中的 2 個函數之間共享公共變量

[英]Sharing common variable between 2 functions in multithreaded environment

我正在編寫一個多線程用例,其中循環在entry()函數中連續運行,並在exit_loop()時結束。 在下面的示例中,使用兩個線程調用entry()並且在調用exit_loop()時兩個線程的執行結束。

現在我想通過在第一次調用exit_loop()時只退出一個線程來稍微改變一下,即從thread[2]調用的entry()仍然存在,當再次調用exit_loop()時可以終止它。 為了使這兩個線程獨立,我可以將static int loop移動到本地范圍。 但是我對在entry()exit_loop()之間傳遞loop狀態的方式感到震驚。

希望在兩個函數之間共享一個公共變量,這不能影響和干擾多線程用例。

#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>
#include<fcntl.h>

static int loop = 1;
void* entry()
{
    int count = 0;
    while(loop)
    {
        count ++;
        printf("\n Count %d, loop %d",count, loop);
    }
}

void exit_loop()
{
    printf("\n Calling exit loop: %d", loop);
    loop = 0;
    printf("\n loop is null %d", loop);
}

void main()
{   
    sem_t* loop1;
    sem_t* loop2;
    pthread_t threadID[5];
    loop1 = sem_open("sem1", O_CREAT | O_EXCL, 0644, 0);
    if (loop1 != SEM_FAILED)
    {   
        printf("\n Created sem 1");
        pthread_create(&threadID[1], NULL, &entry, NULL);// creating thread 1

    printf("Created thread \n ");
}
else
{
    printf("\n Failed to create Semaphore");
}
sem_close(loop1);

loop2 = sem_open("sem2", O_CREAT | O_EXCL, 0644, 0);
if (loop2 != SEM_FAILED)
{   
    printf("\n Created sem 2");
    pthread_create(&threadID[2], NULL, &entry, NULL);//creating thread 2

    printf("Created thread \n ");
}
else
{
    printf("\n Failed to create Semaphore");
}
sem_close(loop2);

printf("Creating exit thread \n");
exit_loop();// exit of both thread

pthread_join(threadID[1],NULL);
pthread_join(threadID[2],NULL);
}

如果您有兩個需要獨立停止的線程,則需要兩個loop變量。

在每種情況下,您都需要一個互斥鎖來保護對共享loop變量的訪問,以防止出現未定義的行為,因為該變量是從兩個線程訪問的(一個讀取它,一個寫入它)。

在它保護的變量旁邊聲明你的互斥量:

struct protected_loop_var{
  pthread_mutex_t mutex;
  int value;
};

struct protected_loop_var loop1={PTHREAD_MUTEX_INITIALIZER,1};
struct protected_loop_var loop2={PTHREAD_MUTEX_INITIALIZER,1};

然后,在訪問每個loop變量之前,鎖定互斥量,然后再解鎖互斥量。 編寫單獨的函數來訪問循環來封裝它可能是最簡單的。

static int read_loop(struct protected_loop_var* loop){
    pthread_mutex_lock(&loop->mutex);
    int value=loop->value;
    pthread_mutex_unlock(&loop->mutex);
    return value;
}

static void write_loop(struct protected_loop_var* loop,int newval){
    pthread_mutex_lock(&loop->mutex);
    loop->value=newval;
    pthread_mutex_unlock(&loop->mutex);
}

然后你的while in entry可以說while(read_loop(&loopvar)) ,在exit_loop中你可以寫write_loop(&loopvar,0)而不是loop=0其中loopvarloop1loop2視情況而定。

如果您需要在每個線程上運行相同的代碼,那么您可以通過void*參數將循環變量的地址傳遞給該線程。

其他模式可能適用於這種特定情況,但互斥量是用於保護對共享變量的多線程訪問的通用工具。

暫無
暫無

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

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