-1

程序应该从命令行获取参数,并通过 posix 线程添加参数。但是 Xcode 成功构建它,但没有输出。这段代码有问题吗。谢谢

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

using namespace std;

void *Add(void *threadid){
  long tid;
  tid =(long)threadid;
  long sum=0;
  sum=sum+tid;
  printf("%ld.\n",sum);
  pthread_exit(NULL);
}    

void *Print(void *threadid){
  long tid;
  tid =(long)threadid;

  printf("%ld.\n",tid);
  pthread_exit(NULL);
}   

int main (int argc, char const *argv[])
{
  if(argc<6){
    printf("you need more arguments");
    return -1;
  }

  long real[5];
  pthread_t athread,bthread;

  for (int x=1;x<=5;x++)
    real[x-1]=atol(argv[x]);

  for(int y=1;y<=5;y++)
    pthread_create(athread[y],NULL,Add,(void *)&real[y]);

  for(int y=1;y<=5;y++)
    pthread_create(bthread[y],NULL,Print,(void *)&real[y]);

  pthread_exit(NULL);
  return 0;
}
4

2 回答 2

1

首先,printf是定义在stdio.h而不是在iostream。如果您想以 C++ 方式使用iostream,cout << "Blabla " << var << endl;则应改为使用。

其次,你pthread_create用错误的论据打电话。正如定义的那样athreadbthread不是数组,但您可以这样使用它们。我不完全确定为什么这甚至会编译,因为pthread_create期望pthread_t*作为第一个参数并且您正在提供*pthread_t. 如果代码编译过,它很可能会在运行时崩溃。

第三,您没有加入加法器线程。这意味着您的打印线程可以在加法器线程完成之前启动。

第四,您正在对局部变量求和。你应该总结成一个全球性的。不要忘记通过互斥锁或其他东西保护对它的访问。

第五,线程例程的参数是错误的。您将指针传递给值而不是值本身,然后将指针重新解释为值本身。您很可能想要使用(void *)real[y]而不是(void *)&real[y]. 请注意,转换longvoid *不适用于所有系统。在 Mac OS X上long,两者void *的长度相同(32 位或 64 位),但通常情况并非如此。

编辑:您的代码甚至无法在 OS X 上编译:

$ g++ -o t.x t.cpp
t.cpp: In function ‘int main(int, const char**)’:
t.cpp:37: error: cannot convert ‘_opaque_pthread_t’ to ‘_opaque_pthread_t**’ for argument ‘1’ to ‘int pthread_create(_opaque_pthread_t**, const pthread_attr_t*, void* (*)(void*), void*)’
t.cpp:40: error: cannot convert ‘_opaque_pthread_t’ to ‘_opaque_pthread_t**’ for argument ‘1’ to ‘int pthread_create(_opaque_pthread_t**, const pthread_attr_t*, void* (*)(void*), void*)’

$ clang -o t.x t.cpp
t.cpp:37:5: error: no matching function for call to 'pthread_create'
    pthread_create(athread[y],NULL,Add,(void *)&real[y]);
    ^~~~~~~~~~~~~~
/usr/include/pthread.h:304:11: note: candidate function not viable: no known
      conversion from 'struct _opaque_pthread_t' to 'pthread_t *' (aka
      '_opaque_pthread_t **') for 1st argument;
int       pthread_create(pthread_t * __restrict,
          ^
t.cpp:40:5: error: no matching function for call to 'pthread_create'
    pthread_create(bthread[y],NULL,Print,(void *)&real[y]);
    ^~~~~~~~~~~~~~
/usr/include/pthread.h:304:11: note: candidate function not viable: no known
      conversion from 'struct _opaque_pthread_t' to 'pthread_t *' (aka
      '_opaque_pthread_t **') for 1st argument;
int       pthread_create(pthread_t * __restrict,
          ^
2 errors generated.

您甚至没有看到 XCode 提供的错误消息吗?

于 2012-05-29T21:04:43.597 回答
1

首先,我认为您应该检查 pthread_create 方法是否成功。我在 Apple 下的 pthread 方面没有经验,但基于该代码,我认为您在创建线程时遇到问题。

于 2012-05-29T18:12:08.563 回答