C pthread打印“异常”

时间:2014-03-28 02:22:54

标签: c multithreading

我一直在做一个C程序,它用一系列线程代表过桥的车,我正确知道的功能是在某个时刻打印出桥的“状态”的功能,所以它显示了汽车(螺纹)在桥梁和哪个位置的位置。 问题是这样的;当只有一个螺纹交叉时,该功能打印正常,您可以看到汽车通过桥梁前进的表示。但是当有更多的线程越过函数变得疯狂时,有时你可以看到一个半桥,或两个桥或一些其他疯狂的东西。我试图解决它为该函数创建pthread_mutex但它不是解决方案,或者至少我没有在正确的地方使用它。 每个线程调用此函数,因为它在桥中前进(桥是一个数组) 对不起,如果我没说清楚;这是功能,感谢你的时间:

void printBridge(bridge *pBridge, int direction) {

system("clear");
int i;

if (direction == WEST) {
    for (i = 0; i < bridgeSize; i++) {
        pthread_mutex_lock(&print);
        if (pBridge->cellState[i] == 0) { //this means the position at the array isn't occupied
            fprintf(stderr, "\t");
        } else if (pBridge->cellState[i] == 1) { //this means a car is at that position
            fprintf(stderr, "  @@@>");  //the cars are represented by @@@>
        }
         pthread_mutex_unlock(&print);
    }
} else {

    for (i = bridgeSize - 1; i >= 0; i--) { //if going the other direction
        pthread_mutex_lock(&print);
        if (pBridge->cellState[i] == 0) {
            fprintf(stderr, "\t");
        } else if (pBridge->cellState[i] == 1) {
            fprintf(stderr, "<@@@ ");

        }
         pthread_mutex_unlock(&print);
    }


}
printf("\n--------------------------------------------------------------------------\n");
fprintf(stderr, "\n Direction= %d", pBridge->direction);

sleep(1); //because I need to see what's going on
 }

所以...正确的印刷品将是这样的:

        <@@@        <@@@ 
--------------------------------------------------------------------------

但有时它会变得如此混乱:

    <@@@ <@@@ <@@@ <@@@     
    --------------------------------------------------------------------------
<@@@ <@@@ <@@@ <@@@     

 Direction= 1--------------------------------------------------------------------------

可能是因为系统(“清除”)一次被许多线程执行了吗?

解决:

解决了调用pthread_mutex_lock并使用互斥锁为函数外部解锁数组的每个位置(桥接):

    pthread_mutex_lock(&pBridge->mutexBridge[i]);
    pBridge->cellState[i]=1;
    printBridge(pBridge,dir);
    pBridge->cellState[i]=0;
    pthread_mutex_unlock(&pPuente->mutexBridge[i]);

由于某些原因,在printBridge函数内部,用互斥体包裹系统(“clear”):

pthread_mutex_lock(&print);
system("clear");
pthread_mutex_unlock(&print);

不做上面给了我疯狂的印刷品。感谢拍拍帮助

1 个答案:

答案 0 :(得分:1)

您只能锁定单个车辆和空间的打印,因此,当打印多个线程时,它们将逐个车辆交叉桥梁。在开始打印桥之前需要获取互斥锁,并在完成后释放它。通过这种方式,线程将交错整个桥而不是单个车。