所以我有这个程序有2个线程从0增加到100个变量,它工作正常。条件变量程序适用于2个线程但不适用于3
#include<stdio.h>
#include<stdlib.h>
#include<semaphore.h>
#include<pthread.h>
int contor;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void *incrementare(void *args) {
int id = (int)args;
while(1) {
pthread_mutex_lock(&mutex);
if (contor >= 100) {
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
while (contor %2 == id) {
pthread_cond_wait(&cond,&mutex);
}
contor++;
printf("Thread %d increment: %d\n",id,contor);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
}
int main(void) {
pthread_t th1, th2,th3;
if(pthread_create(&th1, NULL, &incrementare, (void *)0) < 0) {
perror("Error!\n");
exit(1);
}
if(pthread_create(&th2, NULL, &incrementare, (void *)1) < 0) {
perror("Error!\n");
exit(2);
}
pthread_join(th1, NULL);
pthread_join(th2, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
的结果是这样的:
Thread 1 increment: 1
Thread 0 increment: 2
Thread 1 increment: 3
Thread 0 increment: 4
Thread 1 increment: 5
Thread 0 incre.. and so on ,which is nice.
但问题是,当我尝试用3个线程,它不再工作,因为他们再来找随机。我只做了3个改变,我不知道问题是什么。
#include<stdio.h>
#include<stdlib.h>
#include<semaphore.h>
#include<pthread.h>
int contor;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void *incrementare(void *args) {
int id = (int)args;
while(1) {
pthread_mutex_lock(&mutex);
if (contor >= 100) {
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
while (contor %3 == id) {
pthread_cond_wait(&cond,&mutex);
}
contor++;
printf("Thread %d increment: %d\n",id,contor);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
}
int main(void) {
pthread_t th1, th2,th3;
if(pthread_create(&th1, NULL, &incrementare, (void *)0) < 0) {
perror("Error!\n");
exit(1);
}
if(pthread_create(&th2, NULL, &incrementare, (void *)1) < 0) {
perror("Error!\n");
exit(2);
}
if(pthread_create(&th3, NULL, &incrementare, (void *)2) < 0) {
perror("Error!\n");
exit(3);
}
pthread_join(th1, NULL);
pthread_join(th2, NULL);
pthread_join(th3, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
它应该做同样的权利?现在只有3。为什么它不工作?这是如何工作的
Thread 2 increment: 1
Thread 2 increment: 2
Thread 1 increment: 3
Thread 1 increment: 4
Thread 2 increment: 5
Thread 1 increment: 6
与您的问题无关,但如果您声明函数返回值,则应该返回一个值。即使你忽略返回的值。 –
也与您的问题无关,但[pthread_create'](http://man7.org/linux/man-pages/man3/pthread_create.3.html)函数错误时不会返回“-1”。成功时返回'0',否则返回错误代码。这意味着你检查错误是错误的。 –
在相同级别的优先级任务中,OS按内核喜欢的方式调度线程。如果你想强加一个特定的序列,你应该编码约束。 – LPs