【问题标题】:Ansi C parameter to the thread function get compiler error线程函数的Ansi C参数获取编译器错误
【发布时间】:2021-04-23 12:21:48
【问题描述】:

CreateThread 函数的参数参数出错: 错误 C2440:“函数”:无法从“int (__cdecl *)(BIGVAR *)”转换为“LPTHREAD_START_ROUTINE” 对于每个线程,另一个用于读/写的变量列表和所有其他变量都是只读的。 直接调用线程函数 thread(bigvar[2]);工作正常。 我必须做什么才能给每个线程一个指向每个变量列表的指针?

#define NUM_THREADS 5    
int thread(BIGVAR *bv);    
    
typedef struct typBIGVAR
{
 
 int var1;
 int var2[30];
 
 char var3];
 ...
 // many other variables
 
 }  BIGVAR;
 
 
int main ( int argc, char *argv[] )
{

  buffer = (char *) malloc(sizeof(BIGVAR) * NUM_THREADS);
  Mem = buffer;

  BIGVAR *bigvar[NUM_THREADS]; 
  
  unsigned long ThreadId[NUM_THREADS];
  
  int arrayThread[NUM_THREADS];
  
  
 
  for ( t=0; t<NUM_THREADS; t++ )
  {
    bigvar[t] = (BIGVAR *) Mem;
    Mem += sizeof(BIGVAR);
  }


  thread( bigvar[2] ); // this works fine 



  for ( t=0; t < NUM_THREADS; t++ )
  {
    

    bv = bigvar[t];
    arrayThread[t] = CreateThread(NULL, 0, &thread, bigvar[t], 0, &ThreadId[t]);
    if (arrayThread[t] == NULL)
    {
      printf("Create Thread %d get failed.\n",arrayThread[t]); 
    }
  
  }
 }

【问题讨论】:

  • 这适用于 Windows 吗?

标签: c multithreading parameters


【解决方案1】:

您的线程函数的类型不正确,无法传递给CreateThread

函数thread 的类型是int (*)(BIGVAR *),但CreateThread 期望的函数指针类型是DWORD WINAPI (*)(LPVOID lpParameter)。这些类型不兼容,通过不兼容的函数指针类型调用函数会触发undefined behavior

将函数的签名更改为:

int thread(void *bv);

并在函数内部将参数从void * 转换为BIGVAR *

【讨论】:

  • 你是对的。我错过了预期指针是 __stdcall 的事实。
猜你喜欢
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多