#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 libary的新手,我遇到了一个情况。一般描述如下。 我想在运行时根据输入创建线程并在main函数外部加入线程,所以这里我使用if statemnt创建一个新的 如果count是奇数,则为thread。 我希望所有线程使用相同的信号量和同步,但是当我运行代码时,它只是卡住了, 我想要像这样的输出
执行0,数字为0
执行1,数字为1
执行2,数字为2
执行3,数字为3
执行0,数字为4
执行4,数字为5
执行2,数字为6
执行0,数字为7 ...
这个想法可能吗?如果是的话,我的问题在哪里,谢谢你的帮助!
答案 0 :(得分:0)
首先修复下面的while循环,然后重试。这个循环将无限期,因为if中的条件总是为真。原因是,当您从第一个线程调用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;
}
答案 1 :(得分:0)
if (count % 2 == 0) {
continue;
}
用这个替换上面的代码,因为如果if statement
为真,则计数值不会改变,continue
语句将进入无限循环
if (count % 2 == 0) {
count++;
continue;
}