#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/