我有这段代码
我的范围是:程序创建MAX_THREAD个线程,在这种情况下,每个线程打印一个Thread-ID并退出。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>
#define MAX_THREAD 3
void *thr_func(void *arg);
int main(void) {
pthread_t thr[MAX_THREAD];
int i, thr_err;
/* I expected three threads ... but there is only one */
for (i=0; i<MAX_THREAD; i++) {
printf("thread %d: - ", i);
if ((thr_err = pthread_create(&thr[i],NULL, thr_func, NULL)) != 0) {
fprintf(stderr, "Err. pthread_create() %s\n", strerror(thr_err));
exit(EXIT_FAILURE);
}
if (pthread_join(thr[i], NULL) != 0) {
fprintf(stderr, "Err. pthread_join() %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
}
return(EXIT_SUCCESS);
}
void *thr_func(void *arg)
{
pthread_t tid = pthread_self();
printf("TID %lu - Address 0x%x\n", tid, (unsigned int)pthread_self());
pthread_exit((void*)0);
}
输出是:
thread 0: - TID 3075976048 - Address 0xb757ab70
thread 1: - TID 3075976048 - Address 0xb757ab70
thread 2: - TID 3075976048 - Address 0xb757ab70
我不明白为什么只有一个线程!
我对这个声明有疑问:
pthread_t thr[MAX_THREAD];
我可以创建一个包含三个线程的数组,或者这只是一个线程????
解决
新代码(我只是将pthread_joiun()放在for循环之外)
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/syscall.h>
#define MAX_THREAD 3
void *thr_func(void *thr_num);
int main(void) {
pthread_t thr[MAX_THREAD];
int i, thr_err;
for (i=0; i<MAX_THREAD; i++) {
if ((thr_err = pthread_create(&thr[i],NULL, thr_func, (void*)i)) != 0) {
fprintf(stderr, "Err. pthread_create() %s\n", strerror(thr_err));
exit(EXIT_FAILURE);
}
}
for (i=0; i<MAX_THREAD; i++) {
if (pthread_join(thr[i], NULL) != 0) {
fprintf(stderr, "Err. pthread_join() %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
}
return(EXIT_SUCCESS);
}
void *thr_func(void *thr_num)
{
pthread_t tid;
if ((tid = syscall(SYS_gettid)) == -1) {
fprintf(stderr, "Err. syscall() %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
printf("thread '%d' - TID %lu - Address 0x%x\n",
(int)thr_num, tid, (unsigned int)tid);
pthread_exit((void*)0);
}
输出是:
thread '1' - TID 8780 - Address 0x224c
thread '0' - TID 8779 - Address 0x224b
thread '2' - TID 8781 - Address 0x224d
地址和线程ID现在不同了。
答案 0 :(得分:1)
您可能会获得相同的TID和地址,因为您在开始下一个线程之前pthread_join()
每个线程。 pthreads
库似乎对回收相关数据结构(可能是为了提高效率)有点懒惰,因此您生成的下一个线程只使用与前一个相同的数据结构。尝试编写两个循环,一个用于创建线程,另一个用于在创建所有线程后执行pthread_join()
。
答案 1 :(得分:0)
突然出现的一个问题是在你的循环中使用for(i = 1; i&lt; = MAX_THREAD; i ++)。您的数据结构(pthread_t thr [MAX_THREAD])为0索引。因此,最简单的方法是运行循环(i = 0; i
没有其他出现损坏。您的代码很奇怪,因为您正在启动每个线程(从执行main的线程),然后在继续分叉下一个线程之前通过pthread_join阻止其完成。
这并不能解释为什么你的输出每次显示“线程0:”...我希望在你当前的程序中看到这个从1开始,并且在你的循环中增加“i”增加。如果你不进行pthread产生和加入,你的代码会打印什么?在修复如上所示的循环绑定后,它是否输出“thread 0:thread 1:thread 2:”
答案 2 :(得分:0)
我认为,在开始新线程之前,旧线程正在退出,因此新线程获得相同的TID。通过保持旧线程保持活动来尝试打开新线程,我相信它将提供不同的TID。