我正在学习线程并尝试实现创建线程的代码。线程写入文件。如果已创建线程returns 0
。这里的代码returns 0
但它确实进入函数write()
但不写入文件。只是检查它进入函数我已经放了一个printf()
语句。我想输入应该在命令行这里采取但它也不起作用所以为了使它更简单我只写了“你好世界”文件 。
以下是代码: -
#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);
}
答案 0 :(得分:3)
我怀疑正在发生的事情是在fprintf()到达将内容放入缓冲区之前执行exit()调用。
pthread_create()在创建线程之后返回,而不是在线程完成之后,然后两个线程同时运行。也许这是你的第一个“竞争条件”?
void *result; pthread_join(tid, &result);
将等待在另一个线程中运行的函数返回(并获取它的返回值)。
<强>校正强> 忘了文件指针没有自动关闭,所以这也会阻止你。在fprintf之后调用fflush()或fclose()。
答案 1 :(得分:2)
在退出主程序之前,您需要与线程一起等待它完成。
tid=pthread_create(&thread,NULL,write,NULL);
printf("thread1 return %d \n",tid);
pthread_join(thread, NULL);
exit(0);
您的线程函数应该返回一个值,因为它被声明为这样做。返回NULL很好。
答案 2 :(得分: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