【发布时间】:2020-01-21 08:46:41
【问题描述】:
我正在编写一个多线程用例,其中循环在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);
}
【问题讨论】:
-
一种方法是为每个线程设置一个单独的变量。例如
int loop[2];。然后调用exit_thread(0)或exit_thread(1)设置所需的loop条目。最后,正确声明条目:它应该是void *entry(void *arg)中指定的pthread_createman page。这样,您可以使用不同的arg值创建每个线程,以告诉它要检查哪个loop变量。 -
你为什么使用信号量?您想要实现的功能只需稍作修改即可完成,您需要在
exit_loop()中有一个可以存储线程ID 的参数,然后使用您要终止的线程ID 调用exit_loop()。您还需要使用提供的线程 ID 调用pthread_cancel()。请参考pthread_cancel手册页。
标签: c linux multithreading pthreads