我编写了一个程序,使用pthread创建了许多文件。例如,如果我传递“./ioload110”,这个程序应该创建总共占用1MB磁盘空间的10个文件(即output0、output1、...、output9)。但是,当我运行该程序时,它无法在执行后创建所有10个文件。我想知道是什么导致了这个问题?
#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);
}
}发布于 2013-08-06 05:58:09
每个线程都会被传递一个指向ibuffer的指针。对于主线程循环的每次迭代,ibuffer很可能都有相同的地址,这意味着所有线程都试图从同一内存中读取数据。
不能保证每个新线程都会被调度,并且会在主线程开始其循环的下一次迭代之前创建文件,从而更新ibuffer的内容。这可能会导致多个线程尝试创建相同的文件,或者一些线程在稍后的snprintf调用过程中尝试读取它们的文件名。
要解决此问题,您需要让每个线程发出已完成构造的信号,或者在主线程中存储一个文件名数组,将一个指向不同实例的指针传递到每个线程中。
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);
}
}
....https://stackoverflow.com/questions/18068455
复制相似问题