pthread无法加入未知错误

时间:2011-10-25 22:38:15

标签: macos pthreads semaphore

我正在计划使用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条时它只是咬住灰尘。我不知道发生了什么。

1 个答案:

答案 0 :(得分:1)

你的问题在于:

#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来标注数组,那么它可以正常工作(您将得到一个十个元素的数组)。