Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <pthread.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- int gold = 0;
- pthread_mutex_t gold_mutex;
- void* mine(void *arg){
- int index = (int)arg;
- int count = 0;
- while(count < 2){
- if(pthread_mutex_trylock(&gold_mutex) == 0){
- gold += 10;
- printf("Miner %d gathered 10 gold \n", index);
- // sleep(2);
- pthread_mutex_unlock(&gold_mutex);
- count++;
- }
- }
- }
- void* trade(void *arg){
- int index = (int)arg;
- int count = 0;
- while(count < 2){
- if(pthread_mutex_trylock(&gold_mutex) == 0){
- if(gold < 10){
- printf("Warehouse is empty, cannot sell \n");
- // sleep(2);
- pthread_mutex_unlock(&gold_mutex);
- count++;
- continue;
- }
- gold -= 10;
- printf("Trader %d sold 10 gold \n", index);
- // sleep(2);
- pthread_mutex_unlock(&gold_mutex);
- count++;
- }
- }
- }
- int parse_cmdMaikatideba(char* argv){
- int res = 0;
- for (int i = 0; i < strlen(argv); ++i)
- {
- res*=10;
- res += argv[i] - '0';
- }
- return res;
- }
- int main(int argc, char *argv[])
- {
- int minersCounter = parse_cmdMaikatideba(argv[1]);
- int tradersCounter = parse_cmdMaikatideba(argv[2]);
- printf("%s\n", argv[1]);
- printf("%s\n", argv[2]);
- pthread_t miners[minersCounter];
- pthread_t traders[tradersCounter];
- for (int i = 0; i < minersCounter; ++i)
- {
- int res = pthread_create(&miners[i], NULL, mine, (void*)i);
- if(res != 0){
- exit(0);
- }
- }
- for (int i = 0; i < tradersCounter; ++i)
- {
- int res = pthread_create(&traders[i], NULL, trade, (void*)i);
- if(res !=0){
- exit(0);
- }
- }
- for (int i = 0; i < minersCounter; ++i)
- {
- int res = pthread_join(miners[i], NULL);
- if(res != 0){
- exit(0);
- }
- }
- for (int i = 0; i < tradersCounter; ++i)
- {
- int res = pthread_join(traders[i], NULL);
- if(res != 0){
- exit(0);
- }
- }
- printf("%d\n", gold);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement