我目前正在研究一个例子,在我们当前的工作之前,我们的教授在C ++中使用了信号量和pthreading。当前,当其中一个线程被阻塞时,整个程序将等待。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int account = 99;
bool sent = false;
int rate = 12;
int hours = 15;
sem_t s1;
sem_t s2;
//work thread
void *work(void*){
while(1){
sem_wait(&s1);
account += hours * rate;
cout << "Account: " << account << endl;
if(account >= 1000 && !sent){
sem_post(&s2);
sent = true;
}
sem_post(&s1);
pthread_exit(NULL);
}
}
void* buy(void*){
while(1){
sem_wait(&s2);
sem_wait(&s1);
account -= 1000;
sent = false;
cout << "iPhone bought!! Account: " << account << endl;
sem_post(&s1);
pthread_exit(NULL);
}
}
int main(){
pthread_t workt, buyt;
sem_init(&s1, 0, 1);
sem_init(&s2, 0, 0);
while(1){
pthread_create( &workt, NULL, work, NULL);
pthread_create( &buyt, NULL, buy, NULL);
pthread_join(workt, NULL);
pthread_join(buyt, NULL);
}
sem_close(&s1);
sem_close(&s2);
pthread_exit(NULL);
}
程序应连续运行“工作”线程,直到帐户(1000)中有足够的钱为止,然后它将购买iPhone。我的代码将一直运行,直到它到达“购买”线程中的sem_wait(s2)信号量为止,这会阻塞该线程,但我的整个程序会等待并且不会再次运行“工作”线程。
答案 0 :(得分:0)
您在pthread_exit(NULL);
中的循环中每次迭代都调用work
。基本上,它的行为就像没有循环。
也许您的意思更像是:
while(!sent){
sem_wait(&s1);
account += hours * rate;
cout << "Account: " << account << endl;
if(account >= 1000){
sem_post(&s2);
sent = true;
}
sem_post(&s1);
}
pthread_exit(NULL);