C程序被卡住,未输入main()

时间:2019-03-07 08:23:47

标签: c multithreading main no-response

我正在尝试运行一个程序,其中一个线程从标准输入中获取数据,然后一个线程在标准输出中提供数据,没有什么太复杂的,但是当我使用 /。filename test.out 不会执行任何操作。当我使用 gcc -pthread filename.c -o filename -W -Wall 进行编译时,似乎没有错误或警告出现。有人可以解释吗?同样在文件test.out中什么也没有显示,而在test.in中是一个简单的句子。 这是程序

import React from 'react';
import Button from './Button';

const Table=(props)=>{
    const {list,searchText,onDismiss}=props;
    return(
        <div className="table">

       {/*Filter out item title and search title and give away results from item array */}
        {list.filter((item)=>{
          {/*The includes() method determines whether an array includes a certain value among its entries
          , returning true or false as appropriate. */}
          return item.title.toLowerCase().includes(searchText.toLowerCase());}).map((item)=>{

            return(

            <div key={item.objectID} className="table-row">
                  <span style={{ width: '40%' }}>
                        <a href={item.url}>{item.title}</a>
                        </span>
                        <span style={{ width: '30%' }}>
                        {item.author}
                        </span>
                        <span style={{ width: '10%' }}>
                        {item.num_comments} comments
                        </span>
                        <span style={{ width: '10%' }}>
                        ${item.points} points
                        </span>
                        <span style={{ width: '10%' }}>
                  <Button className="button-inline" onClick={()=>onDismiss(item.objectID)}>delete</Button>
                  </span>

            </div>

          )})}
      </div>
    )

  }


export default Table;

2 个答案:

答案 0 :(得分:2)

您在printf("main/n");中有明显的错别字,而不是printf("main\n");(或者只是puts("main");),但这是一个细节,而不是您的程序永远无法完成的原因

vlakno1 中,您创建了一个死锁:

    if(poc_precitanych == 0){
        pthread_exit(NULL);
    }

因为您没有解锁多文本,所以必须

    if(poc_precitanych == 0){
        pthread_mutex_unlock(&mutex);
        pthread_exit(NULL);
    }

您在 vlakno2 中有相同的问题:

    if(pocet_pisanych == 0){
        pthread_exit(NULL);
    }

必须

    if(pocet_pisanych == 0){
        pthread_mutex_unlock(&mutex);
        pthread_exit(NULL);
    }

以下内容也很奇怪:

    pocet_pisanych = fwrite(a, sizeof(char),poc_precitanych, stdout);

    if(pocet_pisanych == 0){
        pthread_exit(NULL);
    }

即使不是不可能,也很难在 stdou 上进行写操作。因此,让您走出循环的唯一机会就是让poc_precitanych的值为0

另外,您#define V 300,但在其他地方使用 V 时,您执行char a[300];。最好在不定义V的情况下进行char a[V];或在其他地方使用sizeof(a)


更改后的执行示例:

/tmp % ./a.out < /dev/null
main
vlakno 1vlakno 2

没有什么可读取的,因此poc_precitanych的值为0并且两个线程完成了,但是

/tmp % echo "1 2 3" | ./a.out
main
vlakno 1vlakno 1vlakno 21 2 3
^C

答案 1 :(得分:0)

由于printf("main/n");

中的错字,您在终端上看不到任何内容

printf的输出未刷新到stdout,并且创建的线程永远或至少很长时间消耗一次循环。

您应在fflush(stdout);语句后添加printf进行验证。

然后,您可以尝试不使用printf("main\n");的{​​{1}}来验证fflush()是行缓冲的,即:输出换行符时,输出将刷新到终端。

如果将输出重定向到文件,stdout通常会被完全缓冲,因此您应该在每次输出操作之后添加一个显式的stdout,以便您可以在运行中或在输出文件中看到输出。杀死程序后。

请注意,如果您使用英文单词作为标识符,类型,注释和消息,则对于大多数用户而言,该代码将更易于阅读。