我正在通过一些简单的pthread示例形式llnl.computing.gov pthreads教程。网站上的程序打印出threadid的地址,但是我想将id的地址传递给PrintHello,然后使用解引用地址来获取id。我觉得在那里每个线程都应该打印8(线程数)。代码是用HelloWorld与Pthreads损坏的内存
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define NUM_THREADS 8
void *PrintHello(void *threadid)
{
long *taskid = (long *)threadid;
sleep(1);
printf("Hello from thread %ld\n", *taskid);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
for(t=0;t<NUM_THREADS;t++) {
printf("Creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &t);
if (rc) {
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
pthread_exit(NULL);
}
当我在Cygwin编译并运行它时,它seg错误与堆栈损坏错误。如果我重写PrintHello为:
void *PrintHello(void *threadid)
{
long taskid = (long) threadid;
sleep(1);
printf("Hello from thread %ld\n", taskid);
pthread_exit(NULL);
}
不赛格故障,它只是打印的地址,我想取消引用地址和主获得T的值。
有没有人有一些关于如何实现这一目标的指针?我知道我可以通过t
到pthread_create
而不是&t
,但我想这样做是为了学习目的。
这很有道理。如果我传递值't',它会起作用,因为那么每个线程都有自己的't'副本,当'Main'时它不会死掉? – CallMeNorm 2012-08-09 20:59:32
正确的是,当您传递某些值_时,您将复制它供被调用者使用。当你传递指针时,指针本身是按值传递的,但指向的东西在调用者和被调用者中都是相同的。 – 2012-08-09 21:01:11
即使你同步他们 - 它不会做你可能想要的。所有的线程可能会打印相同的数字,因为它们使用相同的变量。打印的值将取决于调度 – Gir 2012-08-09 21:46:32