testsem.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:2k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* Simple test of the SDL semaphore code */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <signal.h>
  5. #include "SDL.h"
  6. #include "SDL_thread.h"
  7. #define NUM_THREADS 10
  8. static SDL_sem *sem;
  9. int alive = 1;
  10. int ThreadFunc(void *data)
  11. {
  12. while ( alive ) {
  13. SDL_SemWait(sem);
  14. fprintf(stderr, "Thread number %d has got the semaphore (value = %d)!n", (int)data, SDL_SemValue(sem));
  15. SDL_Delay(200);
  16. SDL_SemPost(sem);
  17. fprintf(stderr, "Thread number %d has released the semaphore (value = %d)!n", (int)data, SDL_SemValue(sem));
  18. SDL_Delay(1); /* For the scheduler */
  19. }
  20. printf("Thread number %d exiting.n", (int)data);
  21. return 0;
  22. }
  23. static void killed(int sig)
  24. {
  25. alive = 0;
  26. }
  27. int main(int argc, char **argv)
  28. {
  29. SDL_Thread *threads[NUM_THREADS];
  30. int i, init_sem;
  31. if(argc < 2) {
  32. fprintf(stderr,"Usage: %s init_valuen", argv[0]);
  33. exit(1);
  34. }
  35. /* Load the SDL library */
  36. if ( SDL_Init(0) < 0 ) {
  37. fprintf(stderr, "Couldn't initialize SDL: %sn",SDL_GetError());
  38. exit(1);
  39. }
  40. atexit(SDL_Quit);
  41. signal(SIGTERM, killed);
  42. signal(SIGINT, killed);
  43. init_sem = atoi(argv[1]);
  44. sem = SDL_CreateSemaphore(init_sem);
  45. printf("Running %d threads, semaphore value = %dn", NUM_THREADS, init_sem);
  46. /* Create all the threads */
  47. for( i = 0; i < NUM_THREADS; ++i ) {
  48. threads[i] = SDL_CreateThread(ThreadFunc, (void*)i);
  49. }
  50. /* Wait 10 seconds */
  51. SDL_Delay(10 * 1000);
  52. /* Wait for all threads to finish */
  53. printf("Waiting for threads to finishn");
  54. alive = 0;
  55. for( i = 0; i < NUM_THREADS; ++i ) {
  56. SDL_WaitThread(threads[i], NULL);
  57. }
  58. printf("Finished waiting for threadsn");
  59. SDL_DestroySemaphore(sem);
  60. return(0);
  61. }