spin.c
资源名称:c.rar [点击查看]
上传用户:shmaik
上传日期:2014-06-01
资源大小:45093k
文件大小:1k
源码类别:

VC书籍

开发平台:

C/C++

  1. static char rcsid[] = "$Id: H:/drh/idioms/book/RCS/thread.doc,v 1.11 1997/02/21 19:50:51 drh Exp $";
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "assert.h"
  5. #include "fmt.h"
  6. #include "thread.h"
  7. #include "sem.h"
  8. #define NBUMP 30000
  9. struct args {
  10. Sem_T *mutex;
  11. int *ip;
  12. };
  13. int unsafe(void *cl) {
  14. int i, *ip = cl;
  15. for (i = 0; i < NBUMP; i++)
  16. *ip = *ip + 1;
  17. return EXIT_SUCCESS;
  18. }
  19. int safe(void *cl) {
  20. struct args *p = cl;
  21. int i;
  22. for (i = 0; i < NBUMP; i++)
  23. LOCK(*p->mutex)
  24. *p->ip = *p->ip + 1;
  25. END_LOCK;
  26. return EXIT_SUCCESS;
  27. }
  28. int n;
  29. int main(int argc, char *argv[]) {
  30. int m = 5, preempt;
  31. preempt = Thread_init(1, NULL);
  32. assert(preempt == 1);
  33. if (argc >= 2)
  34. m = atoi(argv[1]);
  35. n = 0;
  36. {
  37. int i;
  38. for (i = 0; i < m; i++)
  39. Thread_new(unsafe, &n, 0, NULL);
  40. Thread_join(NULL);
  41. }
  42. Fmt_print("%d == %dn", n, NBUMP*m);
  43. n = 0;
  44. {
  45. int i;
  46. struct args args;
  47. Sem_T mutex;
  48. Sem_init(&mutex, 1);
  49. args.mutex = &mutex;
  50. args.ip = &n;
  51. for (i = 0; i < m; i++)
  52. Thread_new(safe, &args, sizeof args, NULL);
  53. Thread_join(NULL);
  54. }
  55. Fmt_print("%d == %dn", n, NBUMP*m);
  56. Thread_exit(EXIT_SUCCESS);
  57. return EXIT_SUCCESS;
  58. }