我用在pthread_create创建10个线程,传递到thread_func整数
#define THREAD_NUM 10
void *thread_func(void *arg)
{
int v = (int)arg;
printf("v = %d\n", v);
return (void*)0;
}
int main(int argc, const char *argv[])
{
pthread_t pids[THREAD_NUM];
int rv;
int i;
for (i = 0; i < THREAD_NUM; i++) {
rv = pthread_create(&pids[i], NULL, thread_func, (void*)i);
if (rv != 0) {
perror("failed to create child thread");
return 1;
}
}
return 0;
}
我不知道为什么,每次输出不同的结果不只是V = 1 V = 2 ... V = 9
你必须等待所有的线程在主用完成pthread_join
,才可以看出U他们都显示一些价值
#include <stdio.h>
#include <pthread.h>
#define THREAD_NUM 10
void *thread_func(void *arg)
{
int v = (int)arg;
printf("v = %d\n", v);
return (void*)0;
}
int main(int argc, const char *argv[])
{
pthread_t pids[THREAD_NUM];
int rv;
int i;
for (i = 0; i < THREAD_NUM; i++) {
rv = pthread_create(&pids[i], NULL, thread_func, (void*)i);
if (rv != 0) {
perror("failed to create child thread");
return 1;
}
}
for (i = 0; i < THREAD_NUM; i++) {
pthread_join(pids[i], NULL);
}
return 0;
}
样品运行输出:
[root@fc ~]# ./a.out
v = 0
v = 2
v = 4
v = 6
v = 7
v = 8
v = 9
v = 5
v = 3
v = 1
我觉得你的问题是,为什么它不是为了与V同样将它们打印= 1 V = 2 ... V = 9,这是因为内核调度线程,它们可以以任何顺序安排。 如果你希望同步输出,您需要使用锁和条件变量。
以我为例,我有合适的出放。 我也做了一些修改。 你可以给一个尝试呢?
#include <stdio.h>
#include <pthread.h>
#define THREAD_NUM 10
void *thread_func(void *arg)
{
int v = *(int *)arg;
printf("v = %d\n", v);
return (void*)0;
}
int main(int argc, const char *argv[])
{
pthread_t pids[THREAD_NUM];
int rv;
int i;
for (i = 0; i < THREAD_NUM; i++) {
rv = pthread_create(&pids[i], NULL, thread_func, (void*)&i);
if (rv != 0) {
perror("failed to create child thread");
return 1;
}
}
return 0;
}
简要地说,在程序中的线程的回声是一个独立的调度单元,这意味着它们可以实际或虚拟地在由调度器在操作系统的内核确定的顺序并行运行,并且该顺序改变运行根据你的系统的情况下运行那时。