多线程(pthread)竞争代码

时间:2013-07-25 06:07:15

标签: c pthreads

#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
int global;
int i = 30; 
int j = 30; 
int k = 30; 
pthread_mutex_t mutex;
void* child1(void* arg)
{
    while(k--)
    {   
        pthread_mutex_lock(&mutex);
        global++;
        printf("from child1\n");
        printf("%d\n",global);
        pthread_mutex_unlock(&mutex);
    }   
}

void* child2(void* arg)
{
    while(j--)
    {   
        pthread_mutex_lock(&mutex);
        global++;
        printf("from child1\n");
        printf("%d\n",global);
        pthread_mutex_unlock(&mutex);
    }   
}

int main()
{

    pthread_t tid1, tid2;
    pthread_mutex_init(&mutex, NULL);
    pthread_create(&tid1, NULL, child1, NULL);
    pthread_create(&tid2, NULL, child2, NULL);   
    while(i--)
    {
        pthread_mutex_lock(&mutex);
        global++;
        printf("from main\n");
        printf("%d\n",global);
        pthread_mutex_unlock(&mutex);
    }
    return 0;
}

我是pthread和多线程的新手,这段代码的结果是来自主xx child1 很少出现,三个线程永远不会出现在一起,有什么问题?

3 个答案:

答案 0 :(得分:2)

关键部分的大部分时间都将花在printf来电中。你可以试试:

{
    int local;

    pthread_mutex_lock(& mutex);
    local = ++global;
    pthread_mutex_unlock(& mutex);

    printf("from <fn>\n%d\n", local);
}

然而,这仍然没有给出“公平性”的任何保证,但是printf调用很可能使用系统调用或I / O事件来导致调度程序踢进去。


您的程序在很多方面与Dining Philosophers Problem类似。您不希望任何线程“饿死”,但您在全局计数器的线程之间存在争用,并且您希望强制执行有序执行。

答案 1 :(得分:0)

代码中的一个建议替换printf(“from child1 \ n”); to printf(“from child2 \ n”);在void * child2(void * arg)函数中。如果您想确保所有线程都完成,请在main函数结束时添加以下行。     在pthread_join(TID1,NULL);     在pthread_join(TID2,NULL);

答案 2 :(得分:0)

我认为你应该使用3种不同的互斥锁,顺便使用条件控制以避免不安全访问

相关问题