0

次のように定義されたスレッド開始関数を持つスレッドライブラリを使用しようとしています。

int vg_thread_create(VGThreadFunction func, 
  void *arg, 
  VGThreadDescriptor *tid,
  void *stack, 
  size_t stack_size,
  long priority,
  int flags );

そしてVGThreadFunctionは次のtypedefです:

typedef void* (*VGThreadFunction) ( void* )

議論のために、私はこのような関数を持っています:

void doit() {
  cout << "Woohoo printing stuff in new thread\n";
}

この関数のシグネチャはvoid*func(void *)ではありません-私はそのような関数シグネチャを使用することを余儀なくされていますか?

私が試してみると:

VGThreadFunction testfunc = &doit;

私は得る

エラーC2440:「初期化中」:「void(__ cdecl *)(void)」から「VGThreadFunction」に変換できません

vg_thread_createを使用するにはどうすればよいですか?

編集

私はこれを試しました:

void* doit(void* donothingvar) {
  cout << "printing stuff in new thread\n";
  return donothingvar;
}

次に関数で:

VGThreadFunction testfunc = (VGThreadFunction)doit;

int ret = vg_thread_create(testfunc, 0, 0, 0, 0, 0, 0);

次に、vg_thread_createを呼び出すときにアクセス違反が発生します。

関数にステップインすると、_beginthreadexを呼び出すと実際にクラッシュします

Unhandled exception at 0x0040f5d3 in threadtest.exe: 0xC0000005: Access violation  writing location 0x00000000.

何か案は?

関数にステップインすることで、有効なポインターを渡す必要があることがわかりました。ゼロを渡すと、nullの間接参照が発生しました。申し訳ありませんが、少し具体的です。

4

1 に答える 1

6

はい、関数のシグネチャは一致する必要があります。関数にダミーパラメータを設定するだけです。

于 2012-10-17T18:17:51.443 に答える