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

如何从 C 中的命令行创建值的共享缓冲区生产者/消费者多线程问题?

如何解决如何从 C 中的命令行创建值的共享缓冲区生产者/消费者多线程问题?

我使用以下代码从命令行获取要创建的缓冲区的大小:

while ((c = getopt(argc,argv,"d:p:t:b:")) != -1)
    switch (c) {
    case 'd':
      root_dir = optarg;
      break;
    case 'p':
      port = atoi(optarg);
      break;
    case 't':
      // NUMBER OF CONSUMER THREADS
      n_threads = atoi(optarg);
      break;
    case 'b':
      // BUFFER SIZE
      THREAD_BUFFER_SIZE = atoi(optarg);
    default:
      fprintf(stderr,"usage: wserver [-d basedir] [-p port] [-t threads] [-b buffer] \n");
      exit(1);
    }

包含在我的 main() 函数中。

假设我执行 ./wserver -d . -p 8004 -t 8 -b 10。 我希望得到一个大小为 10 的缓冲区。

该缓冲区在生产者和消费者线程之间共享,其函数实现位于 main() 函数之外。这样,我收到一条错误消息,指出“缓冲区未声明”。

然后我在 main 函数之外创建了一个认大小的缓冲区,假设为 4 (int buffer[4];),以便对其进行声明。然后在 main() 函数内部,我添加 buffer = buffer[THREAD_BUFFER_SIZE],它获取从上面的 getopt case 语句请求的大小。这显然是错误的,但我不明白如何替换此代码以允许创建请求大小的共享缓冲区。

有什么建议吗?

第 3 行的认初始化缓冲区和共享缓冲区注释:

char default_root[] = ".";
int count = 0;
int buffer[10];

void *producer(void *THREAD_BUFFER_SIZE) {
  [uses buffer]
}

void *consumer(void *arg) {
  [uses buffer]
}

int main(int argc,char *argv[])
{
  int c;
  char *root_dir = default_root;
  int port = 10000;

  // I created these
  int n_threads;
  int THREAD_BUFFER_SIZE;
  pthread_t* mythreads; // consumer threads
  pthread_t p_id; // producer thread
    
  while ((c = getopt(argc,"usage: wserver [-d basedir] [-p port]\n");
      exit(1);
    }

  // SHARED BUFFER
  buffer = buffer[THREAD_BUFFER_SIZE];

  // Create producer thread
  if (pthread_create(&p_id,NULL,producer,(void*) THREAD_BUFFER_SIZE) != 0) {
    fprintf(stderr,"unable to create producer thread\n");
    exit(1);
  }

  // Create n_threads consumer threads
  mythreads = (pthread_t*) malloc(sizeof(pthread_t)*n_threads);
  for(int i = 0; i < n_threads; i++) {
    if(pthread_create(&mythreads[i],consumer,NULL) != 0) {
      fprintf(stderr,"unable to create consumer thread\n");
      exit(1);
    }
  }


  // run out of this directory
  chdir_or_die(root_dir);

  // Now,get to work
  int listen_fd = open_listen_fd_or_die(port);
  while (1) {
    struct sockaddr_in client_addr;
    int client_len = sizeof(client_addr);
    int conn_fd = accept_or_die(listen_fd,(sockaddr_t *) &client_addr,(socklen_t *) &client_len);
    request_handle(conn_fd);
    close_or_die(conn_fd);
  }

  // Added at end to close and clean
  pthread_join(p_id,NULL);
  free(mythreads);
  pthread_mutex_destroy(&mut);
  
  return 0;
}

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