0

我收到此错误消息,但我似乎不明白。ANSI C++ 禁止在赋值中从“void *”进行隐式转换是什么意思?. 而 Fork 函数只需要函数名和一个数字

线程::Fork(VoidFunctionPtr func, int arg)

错误信息:

../threads/threadtest.cc: In function `void ServerThread(int)':
../threads/threadtest.cc:72: ANSI C++ forbids implicit conversion from `void *' in assignment
../threads/threadtest.cc:78: implicit declaration of function `int WorkerThread(...)'

地区:

72 - 78:

  nextReq = list -> Remove();


  //check till the end                                                                     
  while (nextReq != NULL)
    {
      WorkerThread(&nextReq);

代码:

#include "copyright.h"
#include "system.h"
#include <stdio.h>
#include "request.h"

extern void serve(char *url);
//GLOBAL VARIABLE LIST
List *list;

//----------------------------------------------------------------------
// ThreadTest
//  read file and serve urls
//----------------------------------------------------------------------

void 
ClientThread(int request)
{
  const int sz = 50;
  char url[sz];

  FILE *fp = fopen("url.txt", "r");
  if (!fp)
    printf("  Cannot open file url.txt!\n");
  else {
    int pos = 0;
    char c = getc(fp);
    while (c != EOF || pos == sz - 1) {
      if (c == '\n') {
    url[pos] = '\0';
    serve(url);
    pos = 0;

    //Store necessary information in a Request object for each request. 
    Request req(url, request, 1);

    Request *reqq = &req; //req points to the object
    list->Append(reqq);
      }
      else {
    url[pos++] = c;
      }
      c = getc(fp);
    }
    fclose(fp);
  }
}

//----------------------------------------------------------------------

void
ServerThread(int which)
{

  Request *nextReq;
  //gets the first node off the list
  nextReq = list -> Remove();


  //check till the end
  while (nextReq != NULL)
    {
      WorkerThread(nextReq);

    }


}

//----------------------------------------------------------------------

void
WorkerThread (Request req)
{
  serve(req.url);
  currentThread -> Yield();
}

//----------------------------------------------------------------------

void
ThreadTest()
{
    DEBUG('t', "Entering SimpleTest");
    printf("THREAD TEST");

    //Thread *c = new Thread("client thread");
    Thread *s = new Thread("server thread");

    s->Fork(ServerThread, 1);
    ClientThread(0);

}
4

1 回答 1

2

这似乎是违规行之一:

nextReq = list -> Remove();

似乎list->Remove()返回一个void *. C++需要强制转换才能将其转换为另一个指针(C 不需要)。所以把它改成:

nextReq = static_cast<Request *>(list -> Remove());

(或者,考虑创建List一个模板类,这样您就可以避免这些类型的不安全强制转换。根据您的代码,STL 类std::queue<Request>应该可以满足您的需求。)

第二条违规行是您WorkerThread()在定义之前的调用。您需要在定义ServerThread(). 否则编译器不知道它的原型是什么,一旦它达到真正的定义,它就应该抱怨它ServerThread()与之前推导出的原型不匹配。

void WorkerThread(Request);

void
ServerThread(int which)
{
    // ...

(或者,由于WorkerThread()不调用ServerThread(),您可以交换两个函数的定义顺序来解决问题。)


此外,请注意此代码不好:

Request req(url, request, 1);

Request *reqq = &req; //req points to the object
list->Append(reqq);

您构造一个对象,然后将指向堆栈分配对象的指针推送到列表中。返回时ClientThread(),该对象将被销毁,并且您会留下一个指向不再存在的对象的指针。使用此指针将触发未定义的行为。Request考虑改为通过使用在堆上分配一个新的Request *reqq = new Request(url, request, 1);(但在处理它之后不要忘记delete该对象)。

或者,更好的是,std::queue<Request>按照我之前的建议使用 - 然后你就可以queue.emplace(url, request, 1);. 但请注意,您确实需要一种方法来同步从多个线程访问队列。

于 2014-09-26T03:19:25.207 回答