gpt4 book ai didi

linux - pthread 段错误

转载 作者:太空宇宙 更新时间:2023-11-04 11:22:37 25 4
gpt4 key购买 nike

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

最佳答案

我猜段错误是在 printf("Printing %s\n", BoundBuffer[count].fileName); 附近发出的,对吧?

在您的 PrintClient 中,您将文件名存储到局部变量 str[][] 并将指针复制到该局部变量作为请求的一个参数 req.fileName = str[i];.这样,req.fileName指向的地址就分配到了客户端线程的栈上。

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

关于linux - pthread 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17159563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com