我正在使用pthreads和互斥进行任务。我必须创建n个打印服务器和m个打印客户端,每个客户端有5个打印作业。我们要创建线程,将作业通过大小为4的队列传递给打印服务器,打印服务器然后打印作业(即本例中的繁忙工作)。以下是传递作业和为作业提供服务的代码。
这些是客户端和服务器线程
void *PrintClient(void *arg){
int i;
char str[NUMJOBSPERCLIENT][100];
for(i=1;i<NUMJOBSPERCLIENT;i++){
pthread_mutex_lock(&mutex);
req.clientID = pthread_self();
req.fileSize = rand_int(FILEMIN,FILEMAX);
sprintf(str[i], "File_%d_%d",pthread_self(),i);
req.fileName = str[i];
append(req);
pthread_mutex_unlock(&mutex);
sleep(rand_int(1,3));
}//for
pthread_exit(NULL);
} // end PrintClient
void *PrintServer(void *arg){
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond,&mutex);
while(count > 0){
take();
count = count -1;
}
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
} // end PrintServer
这是从队列中添加或删除作业的代码。我知道错误在这里,它与线程本身有关,但我找不到它的生命。到目前为止,调试器几乎没有任何帮助(我在没有编译错误的大学linux服务器上运行。)
void append(PrintRequest item){
BoundBuffer[count] = req;
printf("I am client %s\n",req.fileName);
count++;
if(count == BUFSIZE){
printf("Buffer Size Reached\n");
pthread_cond_signal(&cond);
}
} // end append
PrintRequest take(){
printf("Printing %s\n", BoundBuffer[count].fileName);
usleep(BoundBuffer[count].fileSize/PRINTSPEED);
printf("Finished Printing %s\n", BoundBuffer[count].fileName);
} // end take
答案 0 :(得分:1)
我猜分段错误是在printf("Printing %s\n", BoundBuffer[count].fileName);
周围发出的信号,对吗?
在PrintClient
中,将文件名存储到本地变量str[][]
,并将指向此局部变量的指针复制为请求req.fileName = str[i];
的一个参数。因此req.fileName
指向的地址被分配在客户端线程的堆栈上。
在服务器线程PrintServer
中处理请求时,生成请求的客户端线程可能不再存在。结果是req.fileName
指向一个不存在的地址(堆栈内存已经在退出客户端线程的情况下被解除分配),然后在{{1}中取消引用这样的地址时,分段故障被发出信号。