Linux pthread分段错误

Linux pthread分段错误,linux,segmentation-fault,pthreads,Linux,Segmentation Fault,Pthreads,我正在使用pthreads和互斥来完成一项任务。我必须创建n个打印服务器和m个打印客户端,每个客户端有5个打印作业。我们将创建线程,通过大小为4的队列将作业传递给打印服务器,然后打印作业(即本例中的繁忙工作)。下面是传递作业和维护作业的代码 这些是客户端和服务器线程 void *PrintClient(void *arg){ int i; char str[NUMJOBSPERCLIENT][100]; for(i=1;i<NUMJOBSPERCLIENT;i++){ pthre

我正在使用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

我猜分段错误是在
printf(“打印%s\n”,BoundBuffer[count].fileName”)附近发出的,对吗

PrintClient
中,将文件名存储到局部变量
str[][]
中,并将指向该局部变量的指针复制为请求的一个参数
req.fileName=str[i]。因此,
req.fileName
所指向的地址被分配到客户端线程的堆栈上

在服务器线程
PrintServer
中处理请求时,生成请求的客户端线程可能不再存在。结果是,
req.fileName
指向一个不存在的地址(堆栈内存已经随着客户端线程的退出而被取消分配),然后当您在
printf中取消引用该地址时(“打印%s\n”,BoundBuffer[count].fileName),表示分段故障

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