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

时间:2016-06-26 12:55:42

标签: c multithreading pthreads volatile

只是线程的初学者,我只是在做一个涉及这2个线程的任务。

#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;
}

我已经读过各种引用并且我的理解pthread_join()意味着如果有2个或更多线程,那么它们将等待一个线程完成其执行,然后下一个线程将开始执行,依此类推。

但是当我运行这个程序时,执行pthread_join(th1)的那一刻,两个线程都被同时创建并执行了#39;这是怎么回事? 输出:

Round:  1
In func2 ...
In func1 ...
The total number counted is: 897651254 

Round:  2
In func1 ...
In func2 ...
The total number counted is: 1051386065

........

我的目标是并行运行这两个线程。现在,加入似乎是这样做的;或者我在某个地方出错?

我已经读过使用volatile不适合C中的线程。那么有什么方法可以将count用作线程2到1的信号吗?

1 个答案:

答案 0 :(得分:2)

引用:

  

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

这是不正确的。加入只是意味着进程等待线程终止。

引用:

  

执行pthread_join(th1)时,两个线程都会同时创建和执行。

这是不正确的。线程已创建并在调用pthread_create时启动注意:通过开始,我的意思是它们已准备好执行。但是,操作系统决定它们何时实际执行,因此执行它们可能需要一些时间。

要在两个线程之间共享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);

main中,您需要初始化互斥锁,如:

pthread_mutex_init(&lock,NULL);