gpt4 book ai didi

c - C中的字符串多线程

转载 作者:太空宇宙 更新时间:2023-11-04 02:47:49 26 4
gpt4 key购买 nike

我的代码有问题,也许你们中的一个可以帮助我。让我们尽量简短...我有一个学校项目要做,它需要管道和线程(PL=C,SO=Debian)。该程序运行良好,除了一个小错误使我无法休眠。

我把我的“线程”放在程序的文件访问中,所以......它只需要打开文件,保存数据,并将文件部分的“报告”保存在一个字符串中,所以“外壳”可以将其显示给用户。

但问题是,如果我在线程内打印字符串(全局),该字符串包含数据,并且已打印,但如果我让在“程序的 shell 部分”打印,则字符串为空,根本没有数据......下面是代码的关键部分,如果有人能帮助我,我将不胜感激。顺便说一句,对不起我的英语,不是我的母语。

也就是线程函数

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;

如果需要任何其他信息,我很乐意提供!

提前致谢!

最佳答案

无法保证在您尝试检索值时线程已经执行。

您需要在等待您创建的线程的主线程中使用信号量。然后该线程需要发布到信号量,这让主线程知道它可以检索值。

互斥体是锁定原语:它们允许您保证对资源的互斥访问。它们本身不提供同步(顺序执行)。为此,您应该使用信号量。从评论来看,您似乎对此有所了解,但您无法让它发挥作用。

这是你的程序应该运行的顺序:

  1. 主线程:初始化信号量(为 0),创建带有指向信号量的指针的目标线程。在需要值之前对创建的信号量进行 sem_wait。执行将阻塞。
  2. 目标线程:设置共享(全局)值,发布到信号量。
  3. 主线程:现在在目标线程中初始化值后恢复执行,并且应该填充该值。

关于c - C中的字符串多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25497101/

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