0
#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和多线程的新手,这段代码的结果是main xxchild1很少出现,三个线程从来没有一起出现过,有什么问题?

4

3 回答 3

2

关键部分的大部分时间都花在printf调用上。你可以试试:

{
    int local;

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

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

然而,这仍然不能保证“公平”,但printf调用很可能使用系统调用或 I/O 事件,这将导致调度程序启动。


您的程序在许多方面类似于餐饮哲学家问题。您不希望任何线程“饿死”,但您在线程之间争用全局计数器,并且您希望强制执行有序执行。

于 2013-07-25T06:17:05.993 回答
0

代码中的一个建议替换 printf("from child1\n"); 到 printf("来自 child2\n"); 在 void* child2(void* arg) 函数中。如果您想确保所有线程都完成,请在 main 函数的末尾添加以下行。pthread_join(tid1,NULL); pthread_join(tid2,NULL);

于 2013-07-25T11:42:32.713 回答
0

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

于 2013-07-25T12:17:07.600 回答