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

int ids = 0;
sem_t sync;
int idx = 0;
int count = 0;


void * add2(void * p_idx) {
    int * tmp = (int *) p_idx;
    int id = ids++;
    sem_wait(&sync);
    (*tmp)++;
    count++;
    printf("executed by %d, number is %d\n", id, *tmp);
    sem_post(&sync);
}

int createThreadOutsideMain() {
    pthread_t *outsideMain = malloc(sizeof(pthread_t));
    pthread_create(outsideMain, NULL, add2, (void *) &idx);
    pthread_join(*outsideMain, NULL);
    return 0;
}

void * add(void * p_idx) {
    int * tmp = (int *) p_idx;
    int id = ids++;
    while(count < 10) {
        if (count % 2 == 0) {
            continue;
        }
        sem_wait(&sync);
        (*tmp)++;
        count++;
        printf("executed by %d, number is %d\n", id, *tmp);
        sem_post(&sync);
    }
    createThreadOutsideMain();
}


int main(int argc, char * argv[]) {
    pthread_t insideMain1, insideMain2;
    sem_init(&sync, 0, 1);
    pthread_create(&insideMain1, NULL, add, (void *) &idx);
    pthread_create(&insideMain2, NULL, add, (void *) &idx);
    pthread_join(insideMain1, NULL);
    pthread_join(insideMain2, NULL);
    return 0;
}


我是C和pthread库的较新版本,遇到了这种情况。通常如下所述。
我想在运行时根据输入创建线程并在主函数外部加入线程,因此在这里我使用if statemnt来创建新线程
如果计数是奇数,则线程。
我希望所有线程都使用相同的信号量&sync,但是当我运行代码时,它只是卡住了,
我想要这样的输出

由0执行,数字为0

由1执行,数字为1

由2执行,数字为2

由3执行,数字为3

由0执行,数字为4

由4执行,数字为5

由2执行,数字为6

由0执行,数字为7
...

这个想法可行吗?如果是这样,我的问题在哪里,谢谢您的帮助!

最佳答案

首先修复以下while循环,然后重试。如果始终为true,则此循环将为不确定的条件。原因是,当您从第一个线程调用add方法时,您正在传递参数零。首先,它锁定mutex并永远停留在while循环中,而第二个线程正在等待锁定被解锁。因此,您的应用程序最终永远陷入循环。将参数传递为1并检查发生了什么。

  while(count < 10) {
    if (count % 2 == 0) {// value of (0 % 2) == 0 always and this loop will continue for ever
        continue;
    }

关于c - C pthread_create并在主要功能之外加入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47243079/

10-11 19:04