当前位置: 首页 > 知识库问答 >
问题:

使用采用 char 指针的函数调用pthread_create

储承
2023-03-14

我有一个接受字符串的函数。由于 pthread 不接受字符串 ,因此我使函数的参数 char 指针。现在我想用pthread_create调用该函数,但我做不到。问题出现是因为虚空*我认为。我搜索了它并做了一些选角,但我无法成功。我该如何修复它,以便它可以在g下工作

#include <iostream>
#include <cstdlib>
#include <pthread.h>

using namespace std;

#define NUM_THREADS     5

void printString(char *x)
{
    cout << x << endl;
        pthread_exit(NULL);
}

int main ()
{
     pthread_t threads[NUM_THREADS];
     int rc;
     int i;
     string temp = "hello";

  char *bufferG;
  bufferG = new char[temp.size() + 1]; 
  std::copy(temp.begin(), temp.end(), bufferG); 
  bufferG[temp.size()] = '\0'; 

     for( i=0; i < NUM_THREADS; i++ ){
         cout << "main() : creating thread, " << i << endl;
         rc = pthread_create(&threads[i], NULL, printString,  &bufferG ); //(void *) &bufferG also doesn't work
     }
 pthread_exit(NULL);
 }

错误是: 线程.cpp: 在函数 “int main()”中: 线程.cpp:27:69: 错误: 从“空 ()(字符)”到“空* ()(空)”的转换无效 [-f宽容] /usr/include/pthread.h:225:12: 错误: 初始化 “pthread_create(pthread_t*, const pthread_attr_t*, void* ()(void), void*)' [-f宽容]

共有2个答案

蒋高扬
2023-03-14

好的,试试这个,现在主线程加入子线程来执行,我们现在使用整个缓冲区来代替打印线程fn中的单个字符

#include <iostream>
#include <cstdlib>
#include <pthread.h>

using namespace std;

#define NUM_THREADS     5

void * printString(void *x)
{
    cout << ((char *)x)<< endl;
}

int main ()
{
     pthread_t threads[NUM_THREADS];
     int rc;
     int i;
     string temp = "hello";

  char *bufferG;
  bufferG = new char[temp.size() + 1]; 
  std::copy(temp.begin(), temp.end(), bufferG); 
  bufferG[temp.size()] = '\0'; 


     for( i=0; i < NUM_THREADS; i++ ){
         cout << "main() : creating thread, " << i << endl;
         rc = pthread_create(&threads[i], NULL, printString,  bufferG ); 
     }
    for( i=0; i < NUM_THREADS; i++ ){
     pthread_join(threads[i], NULL);
    }
 pthread_exit(NULL);
 }
孟德曜
2023-03-14

< code>pthread_create需要的参数是,

void *(*)(void *)

这是一个指向函数的指针,接受一个空指针并返回一个空指针。

更改您的方法以具有以下签名:

/*static*/ void* printString(void *x) { ... }
 类似资料:
  • 问题内容: 在Go中,如果我定义了一个以指针作为接收器的函数,那么它不应该只允许从指针调用该函数吗?为什么可以从值本身调用此函数并产生相同的效果。 例如,在以下程序中:m1.reset()和m2.reset()具有相同的效果。即使m1是一个值而m2是一个指针。 我有点困惑,因为有 两种方法可以做同一件事, 而且不确定要遵循哪种方法。尽管大多数代码遵循使用指针字段调用函数的 约定 。我想念什么吗?

  • 我遇到了一个语法问题。看另一个StackOverflow答案并不能给出一个适用于我的问题的答案。至少不是我能理解的。 我的计划程序类: 这一切都编译得很好,但问题在于调用该函数中的成员函数指针: 编译这个会给我带来错误; 其他尝试: 有人能帮我解释一下我缺了什么知识吗?

  • 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个 指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是 函数指针。 函数指针的定义形式为: returnType (*pointerName)(param list); returnType

  • C++ 函数 向函数传递参数的指针调用方法,把参数的地址复制给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。 按指针传递值,参数指针被传递给函数,就像传递其他值给函数一样。因此相应地,在下面的函数 swap() 中,您需要声明函数参数为指针类型,该函数用于交换参数所指向的两个整数变量的值。 // 函数定义 void swap(int *x, in

  • 我试图从lambda函数隐式构造一个对象。对象的构造函数将函数指针作为参数。但是代码[1]没有编译消息: 但是标准规定lambda函数可以隐式转换为具有相同参数和返回类型[2]的函数指针。这应该适用于这里,因此我希望构造函数是可调用的。 那么为什么代码不能编译呢?谢谢你的解释! [1]代码示例: https://godbolt.org/g/QE4v1Z [2]C 14标准在第5.1节中规定。2.建

  • 问题内容: 我正在尝试在Swift中使用C库,并且在调用任何将函数指针作为参数之一的函数时遇到麻烦。例如,我要在Swift中使用的lua.h文件的一部分看起来像这样: 我使用桥接头来访问库,并且从我的Swift代码中,我可以毫无困难地调用 lua_setuservalue 。但是,如果我尝试调用 lua_callk,则会 收到“使用未解析的标识符’lua_callk’”的信息。如果我从 lua_c