1 #include2 #include 3 #include 4 5 using namespace std; 6 7 HANDLE sem_add, sem_subtract; 8 9 int val(0); 10 11 unsigned int __stdcall add(void* lpa) 12 { 13 printf("add\n"); 14 while (true) 15 { 16 WaitForSingleObject(sem_add, INFINITE); 17 ++val; 18 printf("add: %d\n", val); 19 ReleaseSemaphore(sem_subtract, 1, NULL); 20 } 21 22 //return 999; 23 } 24 25 unsigned int __stdcall subtract(void* lpa) 26 { 27 printf("subtract\n"); 28 while (true) 29 { 30 WaitForSingleObject(sem_subtract, INFINITE); 31 --val; 32 printf("subtract: %d\n", val); 33 ReleaseSemaphore(sem_add, 1, NULL); 34 } 35 36 //return 999; 37 } 38 39 int main(int argc, char ** argv) 40 { 41 sem_add = CreateSemaphore(NULL, 1, 10, NULL); 42 43 sem_subtract = CreateSemaphore(NULL, 0, 10, NULL); 44 45 //ReleaseSemaphore(); 46 printf("[%d]: sem init 0\n", __LINE__); 47 48 HANDLE hThr; 49 hThr = (HANDLE)_beginthreadex(NULL, 0, add, NULL, 0, NULL); 50 51 HANDLE hThr2; 52 hThr2 = (HANDLE)_beginthreadex(NULL, 0, subtract, NULL, 0, NULL); 53 54 55 WaitForSingleObject(hThr, INFINITE); 56 WaitForSingleObject(hThr2, INFINITE); 57 58 return 0; 59 }
1 #include2 #include 3 #include 4 5 using namespace std; 6 7 int val(0); 8 9 sem_t sem_add, sem_subtract; 10 11 void * addFun(void * arg) 12 { 13 while(true) 14 { 15 sem_wait(&sem_add); 16 ++val; 17 printf("addFun: %d\n", val); 18 sem_post(&sem_subtract); 19 } 20 } 21 22 void * subtractFun(void * arg) 23 { 24 while(true) 25 { 26 sem_wait(&sem_subtract); 27 --val; 28 printf("subtractFun: %d\n", val); 29 sem_post(&sem_add); 30 } 31 } 32 33 int main(int argc, char **argv) 34 { 35 int ret(0); 36 sem_init(&sem_add, 0, 10); 37 sem_init(&sem_subtract, 0, 0); 38 // printf("[%d]: %d\n", __LINE__, sem_val); 39 40 pthread_t t_id; 41 ret = pthread_create(&t_id, NULL, addFun, NULL); 42 43 pthread_t t_id2; 44 ret = pthread_create(&t_id2, NULL, subtractFun, NULL); 45 46 pthread_join(t_id, NULL); 47 pthread_join(t_id2, NULL); 48 49 return 0; 50 }
1 #include2 #include 3 #include 4 5 using namespace std; 6 7 //HANDLE sem_add, sem_subtract; 8 HANDLE eve_add, eve_subtract; 9 10 11 int val(0); 12 13 unsigned int __stdcall add(void* lpa) 14 { 15 printf("add\n"); 16 while (true) 17 { 18 WaitForSingleObject(eve_add, INFINITE); 19 //ResetEvent(eve_add); 20 ++val; 21 printf("add: %d\n", val); 22 SetEvent(eve_subtract); 23 } 24 } 25 26 unsigned int __stdcall subtract(void* lpa) 27 { 28 printf("subtract\n"); 29 while (true) 30 { 31 WaitForSingleObject(eve_subtract, INFINITE); 32 //ResetEvent(eve_subtract); 33 --val; 34 printf("subtract: %d\n", val); 35 SetEvent(eve_add); 36 } 37 } 38 39 int main(int argc, char ** argv) 40 { 41 eve_add = CreateEvent(NULL, false, TRUE, NULL); 42 43 eve_subtract = CreateEvent(NULL, false, FALSE, NULL); 44 45 printf("[%d]: sem init 0\n", __LINE__); 46 47 HANDLE hThr; 48 hThr = (HANDLE)_beginthreadex(NULL, 0, add, NULL, 0, NULL); 49 50 HANDLE hThr2; 51 hThr2 = (HANDLE)_beginthreadex(NULL, 0, subtract, NULL, 0, NULL); 52 53 54 WaitForSingleObject(hThr, INFINITE); 55 WaitForSingleObject(hThr2, INFINITE); 56 57 return 0; 58 }