0

我正在学习线程并尝试实现创建线程的代码。线程写入文件。如果线程已经创建它returns 0。这里的代码,returns 0但它确实进入了函数write(),但没有写入文件。只是为了检查它是否进入了我已经写了一个printf()语句的函数。我希望输入应该通过命令行来获取,但它也不起作用,所以为了简单起见,我只在文件中写入了“hello world”。

这是代码:-

#include<stdio.h> 
#include<stdlib.h>
#include<pthread.h>

void *write(void *arg)
{

    printf("HI \n");
    FILE *fp;
    fp = fopen("file.txt", "a");
    if (fp == NULL) {
        printf("error\n");
    } else {
        fprintf(fp, "hello world");
    }
}

int main()
{
    pthread_t thread;
    int tid;
    tid = pthread_create(&thread, NULL, write, NULL);
    printf("thread1 return %d \n", tid);
    exit(0);
}
4

3 回答 3

3

我怀疑发生的事情是在 fprintf() 到达将内容放入缓冲区之前执行 exit() 调用。

pthread_create() 在创建线程后返回,而不是在线程完成后返回,然后两个线程同时运行。也许这是你的第一个“比赛条件”?

void *result; pthread_join(tid, &result);将等待在另一个线程中运行的函数返回(并获取它的返回值)。

更正 忘记了文件指针不会自动关闭,所以这也会阻碍你。在 fprintf 之后调用 fflush() 或 fclose()。

于 2013-08-25T04:57:12.773 回答
2

在退出主程序之前,您需要加入线程以等待它完成。

  tid=pthread_create(&thread,NULL,write,NULL);
  printf("thread1 return %d \n",tid);
  pthread_join(thread, NULL);
  exit(0);

您的线程函数应该返回一个值,因为它被声明为这样做。返回 NULL 很好。

于 2013-08-25T04:53:53.070 回答
0

我认为您应该使用以下代码:

#include <thread>
#include <fstream>
using namespace std;

void write(string filename)
{
ofstream outfile(filename);

outfile<<"Hello World!"<<endl;

outfile.close();
}
int main()
{
thread t(write, "file.txt");
t.join();
}

使用此命令编译代码:g++ -g -std=c++11 test.cpp -lpthread

于 2013-08-25T09:48:10.340 回答