Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2016
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdatomic.h>
  3. #define __USE_GNU
  4. #include <sched.h>
  5. #include <pthread.h>
  6.  
  7. typedef struct {
  8. char name[16];
  9. int sleepTime;
  10. } Node;
  11.  
  12. void _usleep(int);
  13. void* generateSingleThread(void*);
  14. void printAndSleep(Node*);
  15.  
  16. atomic_int acnt;
  17. int main(void) {
  18. cpu_set_t cmask;
  19. unsigned long len = sizeof(cmask);
  20. CPU_ZERO(&cmask); /* 初始化 cmask */
  21. CPU_SET(0, &cmask); /* 指定第一個處理器 */
  22. /* 設定自己由指定的處理器執行 */
  23.  
  24. if (sched_setaffinity(0, len, &cmask)) {
  25. printf("Could not set cpu affinity for current process.\n");
  26. exit(1);
  27. }
  28.  
  29. Node nodes[] = {{"One", 100000}, {"Two", 200000}, {"Three", 300000}};
  30. pthread_t thread[3];
  31. for (int i=0; i<3; ++i) {
  32. pthread_create(&thread[i], NULL, generateSingleThread, (void*) &nodes[i]);
  33. }
  34. for (int i=0; i<3; ++i) pthread_join(thread[i],NULL);
  35. return 0;
  36. }
  37.  
  38. void* generateSingleThread(void* nodes) {
  39. Node* node = (Node*)nodes;
  40. for (int i=0; i<1000; ++i) {
  41. while (acnt) sched_yield() ;
  42. atomic_fetch_add(&acnt, 1);
  43. printf("%dth Time: ", i);
  44. atomic_fetch_sub(&acnt, 1);
  45. printAndSleep(node);
  46. }
  47. pthread_exit(NULL);
  48. }
  49.  
  50. void printAndSleep(Node* node) {
  51. printf("%s\n", node->name);
  52. _usleep(node->sleepTime);
  53. }
  54. void _usleep(int micro)
  55. {
  56. struct timespec req = {0};
  57. req.tv_sec = 0;
  58. req.tv_nsec = micro * 1000L;
  59. nanosleep(&req, (struct timespec *)NULL);
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement