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;
}
由于我是 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;
}