我的代码有问题,也许你们中的一个可以帮助我。简短一点...我有一个学校项目要做,它需要管道和线程(PL = C,SO = Debian)。该程序运行正常,除了一个小错误使我失去了数小时的睡眠。
我将“线程”放入该程序的文件访问中,因此...它只需要打开文件,保存数据,然后将文件的各个部分的“报告”保存在字符串中,以使“外壳”可以将其显示给用户。
但是问题是,如果我在线程内打印字符串(全局),则该字符串具有数据,并且已经打印出来,但是如果我让它在“程序的外壳部分”中打印,则该字符串为空,则没有数据根本...下面是代码的关键部分,如果有人可以帮助我,我将非常感激。顺便说一句,对不起我的英语,而不是我的母语。
那就是线程功能
void *acessaDisco(void *arg)
{
int op;
op = (int) arg;
switch(op)
{
case 1:
//salva no disco
//sem_wait(&semaforoControleTextoThread);
if(escrevePersonagemArquivo(personagemTempThread)==TRUE){
pthread_mutex_lock(&tranca);
sprintf(textoThread,"\n\nSeu personagem foi salvo corretamente!\n\n");
pthread_mutex_unlock(&tranca);
}
else{
pthread_mutex_lock(&tranca);
sprintf(textoThread,"\n\nOcorreu um erro ao tentar salvar seu personagem...\n\n");
pthread_mutex_unlock(&tranca);
}
//sem_post(&semaforoControleTextoThread);
break;
case 2:
//encontra personagem no arquivo
//sem_wait(&semaforoControleTextoThread);
if(encontraPersonagem(nomeBuscaPersonagem,&personagemTempThread)==FALSE){
pthread_mutex_lock(&tranca);
sprintf(textoThread, "\n\nInfelizmente, o personagem %s não foi encontrado... :(\n\n", nomeBuscaPersonagem);
pthread_mutex_unlock(&tranca);
}
else{
pthread_mutex_lock(&tranca);
imprimeFichaTemp(personagemTempThread, textoThread);
strcpy(auxiliarTeste, textoThread);
pthread_mutex_unlock(&tranca);
//printf("\n\n\nDepois bloquear mutex, string: %s", textoThread);
}
//sem_post(&semaforoControleTextoThread);
break;
}
return NULL;
}
这是我叫它的地方
case 300:
//procura o personagem
strcpy(nomeBuscaPersonagem, buff+4*sizeof(char));
pthread_create(&threadAcessaDisco, NULL, acessaDisco, (int)2);
break;
最后,我在哪里打印
case 2:
fflush(stdout);
fflush(stdin);
printf("\n\nAntes Tela Visualizacao\n\n");
telaVisualizacao(writefd);
fflush(stdout);
fflush(stdin);
printf("\n\nAntesSemWaitClient\n\n");
//sem_wait(&semaforoControleTextoThread);
printf("\n\nDepoisSemWaitClient\n\n");
fflush(stdout);
fflush(stdin);
pthread_mutex_lock(&tranca);
printf("\n\nTexto Thread:%s Texto aux: %s\n\n", textoThread, auxiliarTeste);
pthread_mutex_unlock(&tranca);
fflush(stdout);
fflush(stdin);
//sem_post(&semaforoControleTextoThread);
getchar();
break;
如果需要任何其他信息,我将很乐意提供!
提前致谢!!
无法保证在您尝试检索该值时该线程将已经执行。
您需要在主线程中使用一个信号量,该信号量等待您创建的线程。然后,该线程需要发布到信号量,该信号量使主线程知道它可以检索该值。
互斥锁是锁定原语:它们使您可以保证对资源的互斥访问。它们本身不提供同步(顺序执行)。为此,您应该使用信号灯。从注释看来,您似乎对此有所了解,但是很难使其正常工作。
这是程序应运行的顺序:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句