[英]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
其中loopvar
是loop1
或loop2
視情況而定。
如果您需要在每個線程上運行相同的代碼,那么您可以通過void*
參數將循環變量的地址傳遞給該線程。
其他模式可能適用於這種特定情況,但互斥量是用於保護對共享變量的多線程訪問的通用工具。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.