微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

改进多线程生产者/消费者实现的 TLP

如何解决改进多线程生产者/消费者实现的 TLP

我目前正在编写一个多线程 C 程序,该程序使用可变数量的生产者/消费者线程从有界缓冲区中检索/使用矩阵。我使用了一个条件变量来同步线程并开发了一个正确的解决方案,但是经过多次探索,我无法看到如何优化线程级并行性。我当前的实现(包含在下面的片段中)对串行执行没有任何改进,因为它只是锁定缓冲区,因此一次只能添加/删除一个线程。

我已经读到可以对 put() 和 get() 方法使用单独的锁,但我一直无法找到一种方法来使用主互斥锁来锁定生产者和消费者的条件多变的。我尝试为生产者和消费者线程使用不同的互斥锁,但这会引入竞争条件。非常感谢任何输入。

void *prod_worker(void *arg)
{
  while(counters.prod->value < NUMBER_OF_MATRICES) 
  {
    Matrix *mat = GenMatrixRandom(); 
    pthread_mutex_lock(&mutex);
    while(counters.prod->value - counters.cons->value == BOUNDED_BUFFER_SIZE)
    {
      pthread_cond_wait(&retrieved_c,&mutex);
    }
    if (counters.prod->value != NUMBER_OF_MATRICES) 
    {
      put(mat);
      increment_cnt(counters.prod);
    }
    pthread_mutex_unlock(&mutex);
    pthread_cond_signal(&placed_c);
  }
  return NULL;
}


void *cons_worker(void *arg)
{
  Matrix *mat1 = NULL,*mat2 = NULL,*res = NULL;
  while (counters.cons->value < NUMBER_OF_MATRICES)
  {
    pthread_mutex_lock(&mutex); 
    while(counters.prod->value - counters.cons->value == 0 && counters.cons->value != NUMBER_OF_MATRICES)
    {
      pthread_cond_wait(&placed_c,&mutex);
    }
    if (counters.cons->value == NUMBER_OF_MATRICES)  // work is done,wake remaining threads & exit
    {
      pthread_cond_signal(&retrieved_c);
      pthread_mutex_unlock(&mutex);
      break;
    }
    if (mat1 == NULL)
    {
      mat1 = get();
    }
    else 
    {
      mat2 = get();
      res = MatrixMultiply(mat1,mat2); 
    }
    increment_cnt(counters.cons);
    pthread_cond_signal(&retrieved_c);
    if (res != NULL) 
    {
      ... // displays result + frees matrices 
      mat1 = mat2 = res = NULL;
    } 
    else if (mat2 != NULL)
    {
      FreeMatrix(mat2);
      mat2 = NULL;
    }
    pthread_mutex_unlock(&mutex);
  }
  return NULL;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。