在C中使用字符串进行多线程

费尔南多·博索(Fernando Bosso)

我的代码有问题,也许你们中的一个可以帮助我。简短一点...我有一个学校项目要做,它需要管道和线程(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;

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

提前致谢!!

吉兹拉

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

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

互斥锁是锁定原语:它们使您可以保证对资源的互斥访问。它们本身不提供同步(顺序执行)。为此,您应该使用信号灯。从注释看来,您似乎对此有所了解,但是很难使其正常工作。

这是程序应运行的顺序:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在多个线程中使用字符串

来自分类Dev

在PostgreSQL中使用字符串进行循环

来自分类Dev

在Java中使用字符串对选择进行排序?

来自分类Dev

在C中使用字符串数组

来自分类Dev

strcmp()可以在C ++中使用字符串吗?

来自分类Dev

如何使用字符串进行if语句?在 C++

来自分类Dev

在AppResources中使用字符串

来自分类Dev

在结构中使用字符串

来自分类Dev

在java中使用字符串

来自分类Dev

PHP在字符串中使用字符串

来自分类Dev

在C编程中使用字符串和子字符串的基础知识

来自分类Dev

在Excel文件中使用字符串对列进行排序[使用python,pandas]

来自分类Dev

在Excel(VBA)中使用字符串对排序进行修复

来自分类Dev

您可以在elm中使用字符串进行记录访问吗?

来自分类Dev

在SwiftUI中使用字符串插值进行本地化

来自分类Dev

您可以在Elm中使用字符串进行记录访问吗?

来自分类Dev

如何在Python中使用字符串块进行打印格式化?

来自分类Dev

如何在jquery中使用字符串数组对数字进行排序

来自分类Dev

在 Swift3 iOS 中使用字符串参数对对象数组进行排序

来自分类Dev

在字符串中使用字符代码

来自分类Dev

多线程字符串处理

来自分类Dev

多线程下载字符串delphi

来自分类Dev

如何僅使用指針在 C 中使用字符串數組

来自分类Dev

在Webpack中使用require('...')和变量以及在字符串中使用字符串

来自分类Dev

在c#中使用字符串插值连接多个字符串

来自分类Dev

如何在 C# 中使用字符串键和值创建字符串多维数组?

来自分类Dev

在AWK中使用字符串变量打印列

来自分类Dev

如何在RcppEigen中使用字符串变量

来自分类Dev

在库API中使用字符串vs类型

Related 相关文章

热门标签

归档