Pthreads:分段错误错误

sup*_*ame 2 c++ gcc posix mutex pthreads

我有几个问题.这是我第一次尝试制作多线程程序.

注意 - 完整程序位于页面底部

(编译,使用

g++ -pthread -o <executable file name> <sourcefile>.cpp -fpermissive
Run Code Online (Sandbox Code Playgroud)

)

我使用Ubuntu Studio 10.10 64位编译它.

这个程序最大的问题是它给了我一个分段错误.

它似乎是由我在int main()中注释的行引起的.如果我评论该行,它不会给我一个分段错误错误.

为方便起见,这里仅使用int main():

int main()
{
    pthread_attr_t attr;
    pthread_t threads[30];

    /* Initialize mutex and condition variable objects */
    pthread_mutex_init(&direction_mutex, NULL); 
    pthread_mutex_init(&arrive_mutex,NULL);


    pthread_cond_init (&count_threshold, NULL); 
    pthread_cond_init(&arrive_done, NULL);

    /*
     For portability, explicitly create threads in a joinable state

     I'll take your word for it on that one.
     */
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

   for( int x = 0 ; x < 30 ; x++)
   {
      long random = rand();
      int direction;

       if (random < RAND_MAX/2)
       {
            direction = 0;
       }

       else
       {
            direction = 1;
       }

       directions[x] = direction;
       printf("%d",direction);
    }

    printf("\n");

    currdir = directions[0];

    for(int j = 0 ; j < 30 ; j++)
    {
        if(j != 0)
        {
            pthread_cond_wait(&arrive_done, NULL); // THIS line of code is what is causing the problem
        }



        pthread_create(&threads[j], &attr, OneCar, (void *)&Thread_IDs[j]);
    }

    /* Wait for all threads to complete */
    for (j = 0; j < 30; j++) 
    {
        pthread_join(threads[j], NULL);
    }

    printf("test\n");

    /* Clean up and exit */
    pthread_attr_destroy(&attr);
    pthread_mutex_destroy(&direction_mutex);
    pthread_cond_destroy(&count_threshold);
    pthread_exit (NULL);

}
Run Code Online (Sandbox Code Playgroud)

没有那一行,程序运行,但问题是,它似乎在线程顺序中相当随机.

我试图使用该互斥锁来保持int main()从启动一个新线程直到最后一个完成,因为该程序应该让线程以FIFO顺序运行.

如果没有此代码,则行为会有所不同.

大部分时间它从线程0开始,然后转到线程3,4,有时甚至是5,然后再回到线程1.

有时候,它从线程3开始,然后进入线程4,然后线程0 ......我无法弄清楚它为什么这样做.

它每次都是一个不同的线程执行序列,但它永远不会像它需要的那样是0,1,2,3,4

这是输出违规行注释掉的:

*** Output of program with "pthread_cond_wait(&arrive_done, NULL);" commented out:


101110010101011111010001000010
ArriveBridge(): Car 1 goes accross the bridge
ExitBridge(): car 1 has left the bridge
Arrivebridge(): Thead 0 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 0 goes accross the bridge
ExitBridge(): car 0 has left the bridge
Arrivebridge(): Thead 5 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 5 goes accross the bridge
ExitBridge(): car 5 has left the bridge
Arrivebridge(): Thead 3 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 3 goes accross the bridge
ExitBridge(): car 3 has left the bridge
ArriveBridge(): Car 2 goes accross the bridge
ExitBridge(): car 2 has left the bridge
ArriveBridge(): Car 4 goes accross the bridge
ExitBridge(): car 4 has left the bridge
Arrivebridge(): Thead 6 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 6 goes accross the bridge
ExitBridge(): car 6 has left the bridge
Arrivebridge(): Thead 7 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 7 goes accross the bridge
ExitBridge(): car 7 has left the bridge
Arrivebridge(): Thead 8 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 8 goes accross the bridge
ExitBridge(): car 8 has left the bridge
Arrivebridge(): Thead 9 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 9 goes accross the bridge
ExitBridge(): car 9 has left the bridge
Arrivebridge(): Thead 10 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 10 goes accross the bridge
ExitBridge(): car 10 has left the bridge
Arrivebridge(): Thead 11 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 11 goes accross the bridge
ExitBridge(): car 11 has left the bridge
ArriveBridge(): Car 13 goes accross the bridge
ExitBridge(): car 13 has left the bridge
Arrivebridge(): Thead 12 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 12 goes accross the bridge
ExitBridge(): car 12 has left the bridge
Arrivebridge(): Thead 14 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 14 goes accross the bridge
ExitBridge(): car 14 has left the bridge
ArriveBridge(): Car 15 goes accross the bridge
ExitBridge(): car 15 has left the bridge
ArriveBridge(): Car 16 goes accross the bridge
ExitBridge(): car 16 has left the bridge
Arrivebridge(): Thead 18 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 18 goes accross the bridge
ExitBridge(): car 18 has left the bridge
Arrivebridge(): Thead 17 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 17 goes accross the bridge
ExitBridge(): car 17 has left the bridge
ArriveBridge(): Car 19 goes accross the bridge
ExitBridge(): car 19 has left the bridge
Arrivebridge(): Thead 21 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 21 goes accross the bridge
ExitBridge(): car 21 has left the bridge
ArriveBridge(): Car 20 goes accross the bridge
ExitBridge(): car 20 has left the bridge
ArriveBridge(): Car 22 goes accross the bridge
ExitBridge(): car 22 has left the bridge
Arrivebridge(): Thead 23 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 23 goes accross the bridge
ExitBridge(): car 23 has left the bridge
Arrivebridge(): Thead 24 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 24 goes accross the bridge
ExitBridge(): car 24 has left the bridge
ArriveBridge(): Car 25 goes accross the bridge
ExitBridge(): car 25 has left the bridge
ArriveBridge(): Car 26 goes accross the bridge
ExitBridge(): car 26 has left the bridge
ArriveBridge(): Car 27 goes accross the bridge
ExitBridge(): car 27 has left the bridge
ArriveBridge(): Car 29 goes accross the bridge
ExitBridge(): car 29 has left the bridge
Arrivebridge(): Thead 28 is trying to go in the opposite direction, it must wait for traffic to clear
ArriveBridge(): Car 28 goes accross the bridge
ExitBridge(): car 28 has left the bridge
test
Run Code Online (Sandbox Code Playgroud)

这是没有该行注释掉的输出

****output of program before commenting pthread_cond_wait(&arrive_done, NULL); out:


101110010101011111010001000010
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在创建任何线程之前,它几乎立即失败.

我试图改进的另一件事是我的零和一系列不是很随机.是否有更好的方法来生成随机数?它不必非常随机,但这个序列每次都完全相同.

谢谢你的时间

Eri*_*rik 7

你需要实际传递一个互斥量pthread_cond_wait,你正在通过NULL.

对于随机数据(至少在linux上)从/dev/random或读取/dev/urandom.你也可以尝试:direction = (rand() >> 8) & 1

  • 根据我的本地man-page:"它们将被调用线程锁定的互斥锁或未定义的行为结果调用." - 你传递的是一个条件变量而没有互斥量. (2认同)