首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在C++中使用线程创建文件

无法在C++中使用线程创建文件
EN

Stack Overflow用户
提问于 2013-08-06 05:55:27
回答 2查看 333关注 0票数 0

我编写了一个程序,使用pthread创建了许多文件。例如,如果我传递“./ioload110”,这个程序应该创建总共占用1MB磁盘空间的10个文件(即output0、output1、...、output9)。但是,当我运行该程序时,它无法在执行后创建所有10个文件。我想知道是什么导致了这个问题?

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

int numOfThreads;
int sizeOfDisk;
int blockSize = 4096;


void *write(void *name)
{
     FILE * fd;
     char fname[100];
     strcpy(fname,"output");
     strcat(fname, (char *)name);
     int fileSize = sizeOfDisk * 1024 * 1024 / blockSize / numOfThreads; 
     char block[fileSize];
     memset(block, 0, sizeof(*block));

     int i;
     fd = fopen(fname, "w");

     if (NULL == fd)
     {
        fprintf(stderr, "ERROR: FAILED TO OPEN FILE %s\n", fname);
        return NULL;
     }

     for (i = 0; i < fileSize; i++)
        fwrite(block, sizeof(blockSize), 4096, fd);

     fclose(fd);
}

int main(int argc, char * argv[])
{
    if (argc != 3)
    {
        printf("Usage: %s sizeOfDiskInMB #OfThreads\n", argv[0]);
        exit(1);
    }

    sizeOfDisk = atoi(argv[1]);
    numOfThreads = atoi(argv[2]);

    pthread_t ths[numOfThreads];
    int i;

    for (i = 0; i < numOfThreads; i++)
    {
        char ibuffer [100];
        snprintf(ibuffer, sizeof(ibuffer), "%d", i);

        if (pthread_create(&ths[i], NULL, write, (void *)&ibuffer)) 
        {
            fprintf(stderr, "ERROR: FAILD TO CREATE THREAD %d", i);
            exit(1);
        }
    }

    for (i = 0; i < numOfThreads; i++)
    {
        pthread_join(ths[i], 0);
    }

}
EN

Stack Overflow用户

发布于 2013-08-06 05:58:09

每个线程都会被传递一个指向ibuffer的指针。对于主线程循环的每次迭代,ibuffer很可能都有相同的地址,这意味着所有线程都试图从同一内存中读取数据。

不能保证每个新线程都会被调度,并且会在主线程开始其循环的下一次迭代之前创建文件,从而更新ibuffer的内容。这可能会导致多个线程尝试创建相同的文件,或者一些线程在稍后的snprintf调用过程中尝试读取它们的文件名。

要解决此问题,您需要让每个线程发出已完成构造的信号,或者在主线程中存储一个文件名数组,将一个指向不同实例的指针传递到每个线程中。

代码语言:javascript
复制
void *write(void *name)
{
    FILE * fd;
    char fname[100];
    snprintf(fname, sizeof(fname), "output%d", *(int*)name);
    ...


int main(int argc, char * argv[])
{
    ....
    pthread_t ths[numOfThreads];
    int fileNum[numOfThreads];
    int i;
    for (i = 0; i < numOfThreads; i++)
    {
        fileNum[i] = i;
        if (pthread_create(&ths[i], NULL, write, (void *)&fileNum[i])) 
        {
            fprintf(stderr, "ERROR: FAILD TO CREATE THREAD %d", i);
            exit(1);
        }
    }
    ....
票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18068455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档