子pthreads发生分段错误

时间:2016-04-20 23:36:24

标签: c multithreading pthreads

我目前正在开发使用C语言中的pthreads的自定义线程调度程序项目。我一直在使用它进行概念性操作,但最终得到了我期望看到的行为,除了分段错误。

我的工作是注册五个子线程,并根据存储在数组中的ID的顺序安排每个子线程。我所做的是调用SELECT COUNT(*) over (partition by c.Code) ,SUM(ci.Population)/COUNT(*) over (partition by c.Code) FROM Country c INNER JOIN City ci on ci.CountryCode = c.CountryCode GROUP by c.CODE 并告诉不要先安排的子线程等待。我对我的计数器做了一些事情来跟踪下一个孩子应该被调度的时间,并且在一个子线程递增到一个子线程后,它应该唤醒其他线程,并且在定义主循环的同时执行相同的操作。

所有变量:

pthread_mutex_lock

这里是父线程:

#define NTHREADS         5             /* Number of child threads        */
#define NUM_LOOPS  10             /* Number of local loops          */
#define SCHEDULE_INTERVAL 1            /* thread scheduling interval     */

#define errexit(code,str) fprintf(stderr,"%s: %s\n",(str),strerror(code));exit(1);

int schedule_vector[NTHREADS];        /* The thread schedule vector      */

int flag = 0;
pthread_cond_t cv;                   // condtitional variable
pthread_mutex_t mtx;               // mutex semaphore 1
int globalcounter = 0;
int currentThread;
#define TASK_LIMIT  6

这是子线程函数:

int main(int argc,char *argv[])
{
  int       i;                        
  int       worker;                     
  int       ids[NTHREADS];              
  int       errcode;                 
  int       *status;                    
  int       policy;                     

  pthread_t threads[NTHREADS];        

  /* Create child threads --------------------------------------------- */
  for (worker = 0; worker < NTHREADS; worker++)
  {
    ids[worker] = worker;              

    printf("creating child thread using id %d\n", worker);

    /* Create a child thread ----------------------------------------- */
    pthread_create (                 
      &threads[worker],    
      NULL,                 
      my_thread,          
      &ids[worker]);      
    }

    /* Initialize the thread schedule vector  -------------------------- */
    schedule_vector[0] = 0;      /* First thread to be executed (0)      */
    schedule_vector[1] = 1;      /* Second thread to be exceuted (1)     */
    schedule_vector[2] = 2;      /* Third thread to be executed (2)      */
    schedule_vector[3] = 3;      /* Fourth thread to be executed (3)     */
    schedule_vector[4] = 4;      /* Fifth thread to be executed (4)      */

    signal(SIGALRM, clock_interrupt_handler);
    alarm(SCHEDULE_INTERVAL);
    printf("handler set up\n");

    /* Reap the threads as they exit ----------------------------------- */
    for (worker = 0; worker < NTHREADS; worker++)
    {
      /* Wait for thread to terminate --- */
      if (errcode=pthread_join(threads[worker],(void *) &status))
      { errexit(errcode,"pthread_join"); }

      /* Check thread's exit status and release its resources -------- */
      if (*status != worker)
      {
        fprintf(stderr,"thread %d terminated abnormally\n",worker);
        exit(1);
      }
    }

    /* The main (parent) thread terminates itself ---------------------- */
    return(0);
  }

这是我的中断处理程序:

void *my_thread(void * arg)
{
  long int i;                  
  long int counter;      
  int myid=*(int *) arg;  
  counter = 0;
  printf("\nI am thread #%d\n\n", myid);

  /* Main loop ------------------------------------------ */
  for (i = 0; i < NUM_LOOPS; i++)
  {

        currentThread = myid;
        pthread_mutex_lock(&mtx);
        while(myid != schedule_vector[flag]){
          pthread_cond_wait(&cv, &mtx);
        }
        counter++;
        globalcounter = counter;


    printf("Thread: %d is running ...\n", myid);
    usleep(100000);
  }
  return arg;
}

这是输出:

void clock_interrupt_handler(void)
{

  printf("scheduler started ++++++++++++++++++++++++++++++++++ \n");
  if (currentThread == schedule_vector[flag]) {
    printf("scheduled thread received: thread %d, and it's counter is at %d\n", currentThread, globalcounter);
    while(globalcounter < TASK_LIMIT){
    if(globalcounter == 5){
      flag++;
      pthread_cond_broadcast(&cv);
    }
    pthread_mutex_unlock(&mtx);
    alarm(SCHEDULE_INTERVAL);
    }
  } else {
    printf("unscheduled thread received, putting thread %d  with count %d to sleep...\n", currentThread, globalcounter);
    alarm(SCHEDULE_INTERVAL);

  }


}

它基本上重复了这种行为,但对于每个线程。我想了解究竟是什么导致了seg故障

1 个答案:

答案 0 :(得分:0)

似乎pthread_mutex_lock / pthread_mutex_unlock不配对。

正确的代码看起来像

pthread_mutex_lock()
pthread_cond_broadcast()
pthread_mutex_unlock()

pthread_mutex_lock()
pthread_cond_wait()
pthread_mutex_unlock()