将参数传递给pthread_create函数

时间:2014-02-24 06:47:47

标签: c linux multithreading

我使用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

4 个答案:

答案 0 :(得分:1)

你必须等待主要使用pthread_join完成所有线程,然后才能看到所有线程都显示一些值

#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

答案 1 :(得分:0)

我认为你的问题是为什么不按照v = 1 v = 2 ... v = 9的顺序打印它们。这是因为内核调度线程并且可以按任何顺序调度它们。如果需要同步输出,则需要使用锁和条件变量。

答案 2 :(得分:0)

在我的情况下,我有适当的出局。 我做了一些修改。你可以尝试一下吗?

#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;
}

答案 3 :(得分:0)

简而言之,程序中线程的回显是​​一个独立的调度单元,这意味着它们可以按照操作系统内核中的调度程序确定的顺序实际或虚拟地并行运行,并且此顺序更改运行根据您的运行当时的制度情况。