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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* Test the thread and mutex locking functions 
  2.    Also exercises the system's signal/thread interaction
  3. */
  4. #include <signal.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include "SDL.h"
  8. #include "SDL_mutex.h"
  9. #include "SDL_thread.h"
  10. static SDL_mutex *mutex = NULL;
  11. static Uint32 mainthread;
  12. static SDL_Thread *threads[6];
  13. void printid(void)
  14. {
  15. printf("Process %u:  exitingn", SDL_ThreadID());
  16. }
  17. void terminate(int sig)
  18. {
  19. printf("Process %u:  raising SIGTERMn", SDL_ThreadID());
  20. raise(SIGTERM);
  21. }
  22. void closemutex(int sig)
  23. {
  24. Uint32 id = SDL_ThreadID();
  25. int i;
  26. printf("Process %u:  Cleaning up...n", id == mainthread ? 0 : id);
  27. for ( i=0; i<6; ++i )
  28. SDL_KillThread(threads[i]);
  29. SDL_DestroyMutex(mutex);
  30. exit(sig);
  31. }
  32. int Run(void *data)
  33. {
  34. if ( SDL_ThreadID() == mainthread )
  35. signal(SIGTERM, closemutex);
  36. while ( 1 ) {
  37. printf("Process %u ready to workn", SDL_ThreadID());
  38. if ( SDL_mutexP(mutex) < 0 ) {
  39. fprintf(stderr, "Couldn't lock mutex: %s", SDL_GetError());
  40. exit(1);
  41. }
  42. printf("Process %u, working!n", SDL_ThreadID());
  43. SDL_Delay(1*1000);
  44. printf("Process %u, done!n", SDL_ThreadID());
  45. if ( SDL_mutexV(mutex) < 0 ) {
  46. fprintf(stderr, "Couldn't unlock mutex: %s", SDL_GetError());
  47. exit(1);
  48. }
  49. /* If this sleep isn't done, then threads may starve */
  50. SDL_Delay(10);
  51. }
  52. return(0);
  53. }
  54. int main(int argc, char *argv[])
  55. {
  56. int i;
  57. int maxproc = 6;
  58. /* Load the SDL library */
  59. if ( SDL_Init(0) < 0 ) {
  60. fprintf(stderr, "%sn", SDL_GetError());
  61. exit(1);
  62. }
  63. atexit(SDL_Quit);
  64. if ( (mutex=SDL_CreateMutex()) == NULL ) {
  65. fprintf(stderr, "Couldn't create mutex: %sn", SDL_GetError());
  66. exit(1);
  67. }
  68. mainthread = SDL_ThreadID();
  69. printf("Main thread: %un", mainthread);
  70. atexit(printid);
  71. for ( i=0; i<maxproc; ++i ) {
  72. if ( (threads[i]=SDL_CreateThread(Run, NULL)) == NULL )
  73. fprintf(stderr, "Couldn't create thread!n");
  74. }
  75. signal(SIGINT, terminate);
  76. Run(NULL);
  77. return(0); /* Never reached */
  78. }