无法通过 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");
我有一个函数可以计算字符串在 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");