C-当其他线程修改值时,输出线程将更新

问题描述 投票:1回答:2

我有一个程序,该程序使用多线程进行一些计算并将结果添加到全局变量中。还有一个计数器,用于指示已经完成了多少线程以及仍在运行多少线程。线程已分离。除了这些线程之外,还有一个输出线程可以识别另一个线程是否更改了这些全局变量之一。如果是这样,它将打印它们。输出线程也等待被动。

如何使输出线程等待全局值的更改?我可以做一个while循环,直到所有线程完成,然后观察值的改变,但这并不是我真正想要的。我希望输出线程被动地等待。

sem_t sem;
int val1 = 0;
int val2 = 0;
int active = 0;
int finish = 0;

void* calc(void* arg){
    sem_wait(&sem);
    calculate(arg);
    ++finish;
    sem_post(&sem);

    return NULL;
}

void* out(void* arg){

    //what to do here?

    printf();
    return NULL;
}

int main(int argc, char* argv[]){
    pthread_t calcThread;
    int somevalue;
    sem_init(&sem, 0, argv[1]); // max amount of threads running simultaniously
    for(int i = 2; i != argc; i++){
        somevalue = atoi(argv[i]);
        pthread_create(&calcThread, NULL, calc, &somevalue))
        pthread_detach(calcThread);
    }
}
c multithreading unix posix semaphore
2个回答
1
投票

使用sleep()函数是一种解决方法。

while( finish == 0 )
  sleep(1);

此外,我还要在calc()或sem_post()函数中添加一些检查机制,以便在打印值之前不会覆盖它们。

if( finish > 0 )
  sleep(1);

应该工作。


0
投票

建议:

使用一两个互斥锁

  1. 每个线程在更新/访问计数器和其他关键数据时用来避免竞争条件的互斥体
  2. “显示”线程在“互斥条件”上阻塞。
  3. 每次线程更新计数器时,它就会调用“互斥条件”,从而导致“显示”线程继续处理。当'display'线程完成处理后,它再次在'mutex conditional'条件下阻塞]
© www.soinside.com 2019 - 2024. All rights reserved.