问题描述
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 (将#修改为@)