Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将参数传递给pthread会导致重复的C_C_Multithreading_File Io_Pthreads - Fatal编程技术网

将参数传递给pthread会导致重复的C

将参数传递给pthread会导致重复的C,c,multithreading,file-io,pthreads,C,Multithreading,File Io,Pthreads,对于赋值,我应该使用pthread创建一个多线程版本的grep,称为search(即递归),其中参数是/search pattern~/dir~/dir2~/dir3。。etc。此外,分配还特别指出,我应该在末尾使用pthread\u exit(NULL)来连接所有线程,并且我应该为打开的每个文件创建一个线程。这意味着只要找到的每一行都在一个单独的行上,输出就会混乱。这意味着当我以搜索模式传入两个相同的文件时,输出可能会是这样的: $ ./search Hello ~/files/file2.t

对于赋值,我应该使用
pthread
创建一个多线程版本的grep,称为search(即递归),其中参数是
/search pattern~/dir~/dir2~/dir3。。etc
。此外,分配还特别指出,我应该在末尾使用
pthread\u exit(NULL)
来连接所有线程,并且我应该为打开的每个文件创建一个线程。这意味着只要找到的每一行都在一个单独的行上,输出就会混乱。这意味着当我以搜索模式传入两个相同的文件时,输出可能会是这样的:

$ ./search Hello ~/files/file2.txt ~/files/file.txt

2 ~/files/file.txt Hello world 4
1 ~/files/file2.txt Hello there 9
^           ^            ^      ^
argument #, file found, line, line #
我没有多线程,一切都正常。但是,我很难让传入
pthread\u create
的参数结构真正传入正确的内容

我有一个名为
create\u file\u thread
的方法,它接受要打开的文件名,以及它所在参数的索引。然后我有一个名为
thread\u array
的全局变量结构,如下所示:

struct thread_struct {
    char file_name[256];
    int arg_id;
};
struct thread_struct thread_array[200];
我将传递到
create\u file\u thread
中的文件名和索引存储到此结构中,然后将其传递到
pthread\u create
,如下所示:

void create_file_thread(char *file_name, int i)
{
    pthread_t threads[NUM_THREADS]; // NUM_THREADS = 200
    strcpy(thread_array[i].file_name, file_name);
    thread_array[i].arg_id = i + 1; // offset i
    int rc;
    if((rc = pthread_create(&threads[i], NULL, grep_file, &thread_array[i])))    
        exit(-1); // error
}
为了确保这一点,每次调用它时,我都会打印出
thread\u array[I].file\u name
,它最终会给出正确的文件名

下面是一个简化版的
grep_file()
(作为测试,我只是打印出传入的文件名):

如果我将
~/files/file.txt
作为参数1传入,将
~/files/file2.txt
作为参数2传入,我应该将其视为输出:

File name: ~/files/file.txt
File name: ~/files/file2.txt
然而,我最终得出以下结论:

File name: ~/files/file.txt
File name: ~/files/file.txt
奇怪的是,有时候我会得到正确的输出,但大多数时候我会重复给出的第一个参数。因为它只创建两个线程,所以我最终得到两次相同的输出,而不是两个文件名不同的输出。如何停止将参数结构传递到
grep_文件
以停止重复

编辑:

以下是完整的代码:


作为一个警告,由于一些(愚蠢的)限制(比如函数不能超过5行..我打破这个规则只是为了让它工作)。

我没有看到传递单个文件的问题,但是如果传递包含多个文件的目录,
grep\u directory()
将使用相同的
id
值启动多个线程,这些线程将把它们的文件名存储在同一个位置。

create_file_thread
中唯一奇怪的是局部变量
pthread_t threads[NUM_threads]
在该数组中只使用一个条目,一旦函数返回,该数组就会立即消失。否则,你所做的没有错。问题只能出现在调用
create\u file\u thread
的函数中,该函数可能是
main
。您能否更新您的问题以包含调用
create\u file\u thread
的代码?@caf我添加了所有代码。。抱歉,它有点长,但与多线程相关的只有create_file_thread、grep_file和main。我还注释了打开文件的位置,它只是打印传入的文件名。@user3386109我已经添加了所有代码。正如我在上面所解释的,执行多线程的唯一方法是
create\u file\u thread
grep\u file
main
。还有,这很奇怪。。不过,我要离开我教授的例子,不幸的是,我对这一点是全新的。@Alex:作为一个切题的评论,当我看你的代码时,你不应该定义标识符
\u DIR
\u FILE
-以下划线开头,后跟大写字母的标识符保留给实现,在任何情况下。哦。。现在这是有道理的。但我注意到,即使执行
grep_directory()
并打开文件,也会产生正确数量的线程。我应该如何处理传递相同id的问题?我可以只执行
grep\u文件(entry\u path,id+1)
吗?@Alex:您可以将“next thread id”设置为
thread\u数组
旁边声明的全局变量。然后,您不会将
i
传递到
create_file\u thread
——而是只执行
inti=next_id++谢谢你的帮助!但现在发生了一些奇怪的事情。无论出于什么原因,如果我有多个目录作为参数,它将只循环一次。但是,如果我将参数作为文件,所有内容都将正确输出。知道是什么导致了这一切吗?没关系!我发现,我没有为所有打开的文件创建足够的线程,所以它会过早停止。再次感谢您查看我的代码。
File name: ~/files/file.txt
File name: ~/files/file.txt