无法通过 pthread 调用函数

Trouble calling function via pthread

我有一个函数可以计算字符串在 char 数组中出现的次数。使用 findword(copy, "polar") 正常调用此函数工作得很好,并打印一个 int,它是字符串 "polar" 在 char 数组 "copy" 中出现的次数。然而,通过 pthread 调用该函数会出现编译问题,我不知道为什么。这是我第一次实现多线程。

这是我要调用的函数:

void findword(char *str, string word)
{
    char *p;
    vector<string> a;
  
    p = strtok(str, " ");
    while (p != NULL)
    {
        a.push_back(p);
        p = strtok(NULL, " ");
    }

    int c = 0;
    for (int i = 0; i <= a.size(); i++)
  
        
        if (word == a[i])
            c++;
    printf("%d", c);
}

这里是我正在尝试创建的线程,它应该调用该函数:

struct findwordargs {
  char *str;
  string word;
};

struct findwordargs firstwordArguments;
firstwordArguments.str = copy;
firstwordArguments.word = "polar";

pthread_t thread_id = 1;
pthread_create(&thread_id, NULL, findword, (void *)(&firstwordArguments));
pthread_join(thread_id, NULL);


每当我使用 g++ 和 -pthread 标志进行编译时,我都会收到此编译错误:


error: invalid conversion from ‘int (*)(char*, std::string)’ {aka ‘int (*)(char*, std::__cxx11::basic_string<char>)’} to ‘void* (*)(void*)’ [-fpermissive]
  101 | pthread_create(&thread_id, NULL, findword, (void *)(&firstwordArguments));

包含所有必要的头文件,感谢您的帮助。

您使用 pthread 而不是 std::thread 有什么原因吗?既然如此,那就无视我吧。这就是我要做的:

std::thread myThread([=](){ findword(copy, "polar"); });
myThread.join();

-or-

myThread.detach(); // If appropriate.

这取决于类似于现代 C++ 的东西。

您的 findword() 函数与 pthread_create() 要求的签名不匹配:

void *(*start_routine)(void *) 

试试这个:

struct findwordargs
{
    char *str;
    std::string word;
};

void* findword(void *param)
{
    findwordargs *args = static_cast<findwordargs*>(param);
    std::vector<std::string> a;

    char *p = strtok(args->str, " ");
    while (p) {
        a.push_back(p);
        p = strtok(NULL, " ");
    }
    int c = 0;
    for (size_t i = 0; i < a.size(); ++i) {
        if (args->word == a[i])
            c++;
    }
    printf("%d", c);

    /* alternatively, using more C++-ish routines:
    std::istringstream iss(args->str);
    std::string word;
    while (iss >> word) a.push_back(word);
    std::cout << std::count(a.begin(), a.end(), args->word);
    */

    return NULL;
}

...

findwordargs firstwordArguments;
firstwordArguments.str = copy;
firstwordArguments.word = "polar";

pthread_t thread_id = 1;
pthread_create(&thread_id, NULL, findword, &firstwordArguments);
pthread_join(thread_id, NULL); 

话虽如此,创建一个线程只是为了立即加入它是没有意义的。这会阻塞调用线程,直到生成的线程退出,这与直接调用函数的效果相同,但没有线程间上下文切换的开销:

void findword(const std::string &str, const std::string &word)
{
    std::vector<std::string> a;
    std::istringstream iss(str);
    std::string word;
    while (iss >> word) a.push_back(word);
    std::cout << std::count(a.begin(), a.end(), word);
}

...

findword(copy, "polar");