【问题标题】:Pass String array and indexes using Struct to a thread in C使用 Struct 将字符串数组和索引传递给 C 中的线程
【发布时间】:2019-02-20 22:02:38
【问题描述】:

我正在尝试传递一个字符串数组和索引,从哪里开始在数组中结束搜索,我无法从过去两天解决它。我正在向 pthread_create 发送一个结构数据 thread_data,在这里我可以发送 int 和 long 数据,但不能发送字符串数组,有人可以帮助我,如何传递这些。

struct data{
        int  tid;
        unsigned long start;
        unsigned long end;
        char * word;
        char * str;
        };

struct data thread_data[NUM_THREADS];
void *searchString(void *passeddata)
{
   struct data *t_data;
   int tid1;
   char * str[3];
   t_data=(struct data *) passeddata;
   tid1=t_data->tid;
   str=t_data->str;
  .....
   pthread_exit(NULL);
}       
int main(int argc, char *argv[])
{
...
char  work[]={"First Line","Second line","Third line"};
...

   while(fgets(arr[index],120, fp)!=NULL){
        index=index+1;
        thread_data[index].tid=index;
        thread_data[index].str=work;
        ...
        rc=pthread_create(&threads[index],NULL,searchString,(void *)&thread_data[index]);
...     
        }

   pthread_exit(NULL);
}

【问题讨论】:

  • 这一行char work[]={"First Line","Second line","Third line"};你需要二维数组。
  • @kiranBiradar 我已经改变了它,仍然面临这个问题。我在结构中为字符串数组 char * str 声明做对了吗?并传递字符串数组 thread_data[index].str=work;到 pthread_create 或者我有没有改变它。
  • No t_data->str 应该是 char *arr[3] 类型
  • @kiranBiradar 我必须根据文件中的行数计算所需的大小。所以,我没有在结构中添加该大小的大小。你的意思是在结构中声明为 char * str[] 吗?
  • 在这种情况下使用指针指向指针并动态分配内存。

标签: c multithreading struct pthreads


【解决方案1】:

要保存多个字符串,您需要二维数组。

const char  *work[]={"First Line","Second line","Third line", "Fourth Line"};

您需要使用指向struct data 中的指针的指针来保存上述数组。

struct data{
        .....
        const char **str;
        size_t lenOfStr;
        };

并将数组的长度从main函数显式传递给线程函数。

您的示例代码可能如下所示。

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
struct data{
        int  tid;
        unsigned long start;
        unsigned long end;
        char * word;
        const char **str;
        size_t lenOfStr;
        };

struct data thread_data[3];

void *searchString(void *passeddata)
{
   struct data *t_data;
   int tid1;
   const char **str = NULL;
   t_data=(struct data *) passeddata;

   tid1=t_data->tid;
   str=t_data->str;

  int i = 0;
   for (i = 0;i<t_data->lenOfStr;i++)
   printf("%s\n", str[i]);

   pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
        const char  *work[]={"First Line","Second line","Third line", "Fourth Line"};
        int index = 0;
        pthread_t threadid=0;

        thread_data[index].tid=index;
        thread_data[index].str=work;
        thread_data[index].lenOfStr = sizeof(work)/sizeof(*work); // Calculate the size of work here

        int rc=pthread_create(&threadid,NULL,searchString,&thread_data[index]);

        pthread_exit(NULL);
}

【讨论】:

  • 那些字符串文字是const,所以应该是char const*[]。并且不需要将void* 显式转换为另一个指针,因为它在 C 中处于隐式转换中。
  • @MaximEgorushkin 采纳了你的建议!
  • @kiranBiradar 耶!,它有效。这里的初学者不知道指针指针。谢谢
  • @Roger 乐于助人:)
猜你喜欢
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
  • 2015-09-09
相关资源
最近更新 更多