Pthread 编程简短示例

Pthread Programming Short Example

由于我是 pthread 编程的新手,所以我在理解这段代码时遇到了一些困难。据我了解,我们创建 N 个线程 并在它们上执行 运行 函数,它只 打印线程数。我错过了什么吗?

在这种特殊情况下,使用 snprintf(带缓冲区)比 printf 有任何优势吗?这个程序可以进一步改进吗?

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

static int N = 5;
static void* run(void *arg)
{
    int *i = (int *) arg;
    char buf[123];
    snprintf(buf, sizeof(buf), "thread %d", *i);
    return buf;
}

int main(int argc, char *argv[])
{
   int i;
   pthread_t *pt = NULL;
   for (i = 0; i < N; i++) {
       pthread_create(pt, NULL, run, &i);
   }

   return EXIT_SUCCESS;
}

首先,您的线程 return 垃圾。引用指针 returned 将是未定义行为,因为它指向在函数 returns 之后不再存在的存储。还好没有用到指针。

接下来,线程不打印任何内容,因为 snprintf 输出到数组,而不是标准输出。

此外,如果您切换到 printf,线程将打印垃圾,因为相同的指针被传递给所有线程。

这是假设线程有机会 运行 因为 main 不等待线程完成。你必须加入他们。

固定:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

#define N 5

static void *run(void *arg) {
    size_t job = *(size_t*)arg;
    printf("Job %zu\n", job);
    return NULL;
}

int main(int argc, char *argv[]) {
   size_t jobs[N];
   pthread_t threads[N];
   for (size_t i=0; i<N; ++i) {
       jobs[i] = i;
       pthread_create(threads+i, NULL, run, jobs+i);
   }

   for (size_t i=0; i<N; ++i) {
       pthread_join(threads[i]);
   }

   return EXIT_SUCCESS;
}

将整数转换为指针也很常见。

#include <inttypes.h>
#include <pthread.h>
#include <stdio.h>
#include <stdint.h>

static void *run(void *arg) {
    size_t job = *(uintptr_t*)arg;
    printf("Job %" PRIuPTR "\n", job);
    return NULL;
}

int main(int argc, char *argv[]) {
   pthread_t threads[N];
   for (uintptr_t i=0; i<N; ++i) {
       pthread_create(threads+i, NULL, run, (void*)i);
   }

   for (uintptr_t i=0; i<N; ++i) {
       pthread_join(threads[i]);
   }

   return EXIT_SUCCESS;
}