c-使用共享变量并行运行2个线程

c-使用共享变量并行运行2个线程,c,multithreading,pthreads,volatile,C,Multithreading,Pthreads,Volatile,只是一个线程的初学者,我只是在做一个包含这两个线程的任务 #include <stdio.h> #include <pthread.h> int count = 0; void waitFor(unsigned int secs) { unsigned int retTime = time(0) + secs; while(time(0) < retTime); } void func1(void * args) { printf("I

只是一个线程的初学者,我只是在做一个包含这两个线程的任务

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

int count = 0;

void waitFor(unsigned int secs)
{
    unsigned int retTime = time(0) + secs;
    while(time(0) < retTime);
}

void func1(void * args)
{
    printf("In func1 ...\n");
    long i = 0;
    while(1){
        i++;
        if(count == 1)
            break;
    }
    printf("The total number counted is: %ld \n", i);
    count = 0;
    i = 0;
}

void func2(void * args)
{
    printf("In func2 ...\n");
    waitFor(3);
    count = 1;
}


int main()
{
    pthread_t th1, th2;

    int j = 0;
    while(j++ < 4){
        printf("\nRound:\t%d\n", j);

        pthread_create(&th1, NULL, (void*)func1,NULL);
        pthread_create(&th2, NULL, (void*)func2, NULL);

        pthread_join(th1,NULL);
        pthread_join(th2,NULL);
        waitFor(3);
    }

    return 0;
}
我的目标是并行运行这两个线程。现在,join似乎正在这样做;还是我哪里出了问题

我已经读到,对于C中的线程,使用volatile是不可取的。那么有没有任何方法可以使用count作为从线程2到1的信号呢?

Quote:

我对pthread_join()的理解是,如果有2个或更多线程,那么它们将等待一个线程完成其执行,然后下一个线程将开始执行,依此类推

这是不正确的。Join仅仅意味着进程等待线程终止

引述:

执行pthread_join(th1)的那一刻,两个线程都被创建并“并发”执行

这是不正确的。线程是在调用
pthread\u create
时创建和启动的。注意:通过start我的意思是它们已经准备好执行了。然而,由操作系统决定何时真正开始执行,因此在执行之前可能需要一些时间

要在两个线程之间共享
count
,可以使用互斥锁

int count = 0;
pthread_mutex_t lock;
访问
count
时,必须首先锁定互斥锁,读取/写入变量并解锁互斥锁

例如:

pthread_mutex_lock(&lock);
count = 1;
pthread_mutex_unlock(&lock);
pthread_mutex_lock(&lock);
if(count == 1) 
{
    pthread_mutex_unlock(&lock);
    break;
}
pthread_mutex_unlock(&lock);
例如:

pthread_mutex_lock(&lock);
count = 1;
pthread_mutex_unlock(&lock);
pthread_mutex_lock(&lock);
if(count == 1) 
{
    pthread_mutex_unlock(&lock);
    break;
}
pthread_mutex_unlock(&lock);
main
中,需要初始化互斥锁,如下所示:

pthread_mutex_init(&lock,NULL);

您在哪里读到“如果有2个或更多线程,那么它们将等待一个线程完成其执行,然后下一个线程将开始执行”?Pthread_join只是等待作为参数提供的线程终止。是什么让你认为你的踏板是在调用pthread_join时创建的?您的线程是用pthread_create创建和启动的。需要保护对共享变量(
count
此处)的并发读/写访问。这通常是使用互斥锁完成的。请参阅这些函数上的
pthread\u mutex_*()
函数。@alk,如果我在func2中锁定count,在func2解锁count之前,我的整个func1不会停止吗?或语句,直到func1中的“count”被执行并等待func2解除锁定?那么这就意味着没有并发,对吗?如果有任何答案解决了您的问题,请单击大复选框接受它作为答案。这将向社区表明您找到了一个解决方案,并将给您和回答者带来一些声誉。我知道线程从我们执行“pthread_create”的那一刻开始执行。这是否意味着并行执行?当我尝试不使用“pthread_join”时,我的线程2甚至没有启动。为什么?@infoseeker-是的,同样如此。但并行的含义可能因系统而异。简单的单核CPU只使用分时,而多核CPU可以真正并行运行线程。@Infoseek引用:
如果没有“pthread_join”,我的线程2甚至不会启动。为什么?
如果没有关于您系统的详细信息,我无法知道。猜测可能是
main
threads
实际执行之前完成。在任何情况下,都需要join,因为您需要等待线程运行terminate@infoseeker:只需通过调用
pthread\u exit()
离开
main()
。这和另一条线差不多。如果
main()
以简单的
return
ing结束,那么整个过程将与其所有线程一起结束。后者在您看来似乎线程甚至都没有启动。您可能想指出,仅仅定义一个互斥变量(如代码段所示)是不够的。它需要事先进行初始化。