pthread 无法加入并出现未知错误

发布于 2024-12-11 22:24:37 字数 3607 浏览 0 评论 0原文

我计划使用 pthreads 和 mach 信号量来尝试基本上将并行计算分配给有限数量的 CPU,但我无法完全让测试程序正常工作。现在我有一些东西只是通过线程并打印出一些标识符,以便我可以验证它是否有效。代码非常简单,只是我使用的是 OSX,所以我必须使用 mach 信号量而不是 POSIX。我的代码如下

#include <iostream>
#include <pthread.h>
#include <semaphore.h>
#include <errno.h>
#include <mach/semaphore.h>
#include <mach/mach.h>

#define MAX_THREADS 256

semaphore_t free_CPU = 0;

void* t_function(void *arg) {
    int* cur_number;
    cur_number = (int*) arg;
    kern_return_t test = semaphore_wait(free_CPU);
    std::cout << "I am thread # " << *cur_number << ". Kernel return is " << test << std::endl;
    semaphore_signal(free_CPU);
    std::cout << "I am thread # " << *cur_number << ". I just signaled the semaphore." << std::endl;
    pthread_exit(NULL);
}

int main (int argc, char * const argv[]) {
    int num_reps = 10;
    int n_threads = 1;
    if (n_threads < MAX_THREADS) {
        n_threads += 0;
    } else {
        n_threads = MAX_THREADS;
    }
    pthread_t threads[n_threads];

    semaphore_create(mach_task_self(), &free_CPU, SYNC_POLICY_FIFO, 1);

    // Loop over a bunch of things, feeding out to only nthreads threads at a time!
    int i;
    int* numbers = new int[num_reps];
    for (i = 0; i < num_reps; i++) {
        numbers[i] = i;
        std::cout << "Throwing thread " << numbers[i] << std::endl;
        int rc = pthread_create(&threads[i], NULL, &t_function, &numbers[i]);
        if (rc) {
            std::cout << "Failed to throw thread " << i << " Error: " << strerror(errno) << std::endl;
            exit(1);
        }
    }

    std::cout << "Threw all threads" << std::endl;

    // Loop over threads to join
    for (i = 0; i < num_reps; i++) {
        std::cout << "Joining thread " << i << std::endl;
        int rc = pthread_join(threads[i],NULL);
        if (rc) {
            std::cout << "Failed to join thread " << i << ". Error: " << strerror(errno) << std::endl;
            exit(1);
        }
    }

    semaphore_destroy(mach_task_self(), free_CPU);

    delete[] numbers;

    return 0;
}

运行此代码给我:

Throwing thread 0
Throwing thread 1
Throwing thread 2
Throwing thread 3
Throwing thread 4
Throwing thread 5
Throwing thread 6
Throwing thread 7
Throwing thread 8
Throwing thread 9
Threw all threads
Joining thread 0
I am thread # 0. Kernel return is 0
I am thread # 0. I just signaled the semaphore.
I am thread # 1. Kernel return is 0
I am thread # 1. I just signaled the semaphore.
I am thread # 2. Kernel return is 0
I am thread # 2. I just signaled the semaphore.
I am thread # 3. Kernel return is 0
I am thread # 3. I just signaled the semaphore.
I am thread # 4. Kernel return is 0
I am thread # 4. I just signaled the semaphore.
I am thread # 5. Kernel return is 0
I am thread # 5. I just signaled the semaphore.
I am thread # 6. Kernel return is 0
I am thread # 6. I just signaled the semaphore.
I am thread # 7. Kernel return is 0
I am thread # 7. I just signaled the semaphore.
I am thread # 8. Kernel return is 0
I am thread # 8. I just signaled the semaphore.
I am thread # 9. Kernel return is 0
I am thread # 9. I just signaled the semaphore.
Joining thread 1
Joining thread 2
Joining thread 3
Joining thread 4
Joining thread 5
Joining thread 6
Joining thread 7
Joining thread 8
Failed to join thread 8. Error: Unknown error: 0

对我来说,看起来一切都很好,除了当它尝试加入线程 8 时它只是咬碎了灰尘。我不知道发生了什么。

I'm planning using pthreads and mach semaphores to try to basically farm out a parallel computation to a limited number of CPUs, and I can't quite get a test program to work. Right now I have something that just goes through threads and prints out some identifier so that I could verify that it works. The code is pretty simple, except that I'm on OSX so I have to use mach semaphores instead of POSIX. My code is below

#include <iostream>
#include <pthread.h>
#include <semaphore.h>
#include <errno.h>
#include <mach/semaphore.h>
#include <mach/mach.h>

#define MAX_THREADS 256

semaphore_t free_CPU = 0;

void* t_function(void *arg) {
    int* cur_number;
    cur_number = (int*) arg;
    kern_return_t test = semaphore_wait(free_CPU);
    std::cout << "I am thread # " << *cur_number << ". Kernel return is " << test << std::endl;
    semaphore_signal(free_CPU);
    std::cout << "I am thread # " << *cur_number << ". I just signaled the semaphore." << std::endl;
    pthread_exit(NULL);
}

int main (int argc, char * const argv[]) {
    int num_reps = 10;
    int n_threads = 1;
    if (n_threads < MAX_THREADS) {
        n_threads += 0;
    } else {
        n_threads = MAX_THREADS;
    }
    pthread_t threads[n_threads];

    semaphore_create(mach_task_self(), &free_CPU, SYNC_POLICY_FIFO, 1);

    // Loop over a bunch of things, feeding out to only nthreads threads at a time!
    int i;
    int* numbers = new int[num_reps];
    for (i = 0; i < num_reps; i++) {
        numbers[i] = i;
        std::cout << "Throwing thread " << numbers[i] << std::endl;
        int rc = pthread_create(&threads[i], NULL, &t_function, &numbers[i]);
        if (rc) {
            std::cout << "Failed to throw thread " << i << " Error: " << strerror(errno) << std::endl;
            exit(1);
        }
    }

    std::cout << "Threw all threads" << std::endl;

    // Loop over threads to join
    for (i = 0; i < num_reps; i++) {
        std::cout << "Joining thread " << i << std::endl;
        int rc = pthread_join(threads[i],NULL);
        if (rc) {
            std::cout << "Failed to join thread " << i << ". Error: " << strerror(errno) << std::endl;
            exit(1);
        }
    }

    semaphore_destroy(mach_task_self(), free_CPU);

    delete[] numbers;

    return 0;
}

Running this code gives me:

Throwing thread 0
Throwing thread 1
Throwing thread 2
Throwing thread 3
Throwing thread 4
Throwing thread 5
Throwing thread 6
Throwing thread 7
Throwing thread 8
Throwing thread 9
Threw all threads
Joining thread 0
I am thread # 0. Kernel return is 0
I am thread # 0. I just signaled the semaphore.
I am thread # 1. Kernel return is 0
I am thread # 1. I just signaled the semaphore.
I am thread # 2. Kernel return is 0
I am thread # 2. I just signaled the semaphore.
I am thread # 3. Kernel return is 0
I am thread # 3. I just signaled the semaphore.
I am thread # 4. Kernel return is 0
I am thread # 4. I just signaled the semaphore.
I am thread # 5. Kernel return is 0
I am thread # 5. I just signaled the semaphore.
I am thread # 6. Kernel return is 0
I am thread # 6. I just signaled the semaphore.
I am thread # 7. Kernel return is 0
I am thread # 7. I just signaled the semaphore.
I am thread # 8. Kernel return is 0
I am thread # 8. I just signaled the semaphore.
I am thread # 9. Kernel return is 0
I am thread # 9. I just signaled the semaphore.
Joining thread 1
Joining thread 2
Joining thread 3
Joining thread 4
Joining thread 5
Joining thread 6
Joining thread 7
Joining thread 8
Failed to join thread 8. Error: Unknown error: 0

To me, it looks like everything is totally fine, except it just bites the dust when it tries to join thread 8. I have no clue what's going on.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

染火枫林 2024-12-18 22:24:37

你的问题就在这里:

#define MAX_THREADS 256
:
int n_threads = 1;
if (n_threads < MAX_THREADS) {
    n_threads += 0;
} else {
    n_threads = MAX_THREADS;
}
pthread_t threads[n_threads];

这给了你一个一个线程ID的数组。然后你尝试填充其中的十个。

我不完全确定您想通过此实现什么目的。在我看来,如果您只是使用 num_reps 来确定数组的尺寸,它会很好地工作(您将得到一个由 10 元素组成的数组)。

Your problem lies here:

#define MAX_THREADS 256
:
int n_threads = 1;
if (n_threads < MAX_THREADS) {
    n_threads += 0;
} else {
    n_threads = MAX_THREADS;
}
pthread_t threads[n_threads];

This is giving you an array of one thread ID. You're then trying to populate ten of them.

I'm not entirely certain what you're trying to acheive with that. It seems to me that, if you just used num_reps to dimension your array, it would work fine (you'd get an array of ten elements).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文