user-0 提问: 怎么用C语言实现两个线程在Linux环境下打印1~100

回复:
user: user-1
content: 引用 7 楼 dkhghj 的回复:[quote=引用 4 楼 angel_su 的回复:] 整个线程从头到尾几乎锁住，貌似再开线程没啥意思了吧。多线程场景应该是只要任务不重复即可，print耗时不一，先后也不咋要求，那么锁住n一下立即释放，类似：  pthread_mutex_lock(&mutex); int val = n++; pthread_mutex_unlock(&mutex); if (val > N)     break; //your print routine... 完全正确，怎么就没想到临时变量的方法，谢谢！[/quote] 怎么搞的，好像没怎么理解

user: user-2
content: 你的锁根本就没锁住，你想想，线程一获得锁-打印-释放锁；此时如果线程二未获得时间片，还是线程一。那又是线程一获得锁-打印-释放锁。。。直到线程二获得时间片。 由此，应该叫个条件#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <pthread.h>  int n = 1; int N = 100; pthread_mutex_t mutex; pthread_mutex_init(&mutex);  int pv=1;//条件 void *func1() {         while(n < N+1)         {                if(pv==1)//              {                 pthread_mutex_lock(&mutex);                 printf("%d 1\n",n);                 n++;                pv=2;//                 pthread_mutex_unlock(&mutex);             }         }         if(n == N+1)                 pthread_exit(NULL); }  void *func2() {         while(n < N+1)         {           if(pv==2)        {                 pthread_mutex_lock(&mutex);                 printf("%d 2\n",n);                 n++;            pv=1;                 pthread_mutex_unlock(&mutex);        }         }         if(n == N+1)                 pthread_exit(NULL); }   int main(int argc, char** argv) {         pthread_t pid1,pid2;          if((pthread_create(&pid1,NULL,func1,NULL)) != 0)                 printf("pthread create error\n");         if((pthread_create(&pid2,NULL,func2,NULL)) != 0)                 printf("pthread create error\n");          pthread_join(pid1,NULL);         pthread_join(pid2,NULL);          return 0; } 你可以看看 线程的条件锁和互斥锁

user: user-0
content: 引用 4 楼 angel_su 的回复:整个线程从头到尾几乎锁住，貌似再开线程没啥意思了吧。多线程场景应该是只要任务不重复即可，print耗时不一，先后也不咋要求，那么锁住n一下立即释放，类似：  pthread_mutex_lock(&mutex); int val = n++; pthread_mutex_unlock(&mutex); if (val > N)     break; //your print routine... 完全正确，怎么就没想到临时变量的方法，谢谢！

user: user-0
content: 引用 5 楼 wangliangffaflgh 的回复: #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <pthread.h>  int n = 1; int N = 100;  pthread_mutex_t mutex;  void *func1() {     while(n<=N)     {         printf("%d 1\n", n);         pthread_mutex_lock(&mutex);         n++;         pthread_mutex_unlock(&mutex);     }          if(n==N)         pthread_exit(NULL);     return NULL; }  void *func2() {     while(n<=N)     {         printf("%d 2\n", n);         pthread_mutex_lock(&mutex);         n++;         pthread_mutex_unlock(&mutex);     }     if(n==N)         pthread_exit(NULL);     return NULL; }  int main(int argc, char** argv) {     pthread_t pid1,pid2;      pthread_mutex_init(&mutex, NULL);          if((pthread_create(&pid1,NULL,func1,NULL)) != 0)         printf("pthread create error\n");     if((pthread_create(&pid2,NULL,func2,NULL)) != 0)         printf("pthread create error\n");          pthread_join(pid1,NULL);     pthread_join(pid2,NULL);          return 0; }   基本上是一个线程在打印，另外结果有误，谢谢你的答复

user: user-3
content: #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <pthread.h>  int n = 1; int N = 100;  pthread_mutex_t mutex;  void *func1() {     while(n<=N)     {         printf("%d 1\n", n);         pthread_mutex_lock(&mutex);         n++;         pthread_mutex_unlock(&mutex);     }          if(n==N)         pthread_exit(NULL);     return NULL; }  void *func2() {     while(n<=N)     {         printf("%d 2\n", n);         pthread_mutex_lock(&mutex);         n++;         pthread_mutex_unlock(&mutex);     }     if(n==N)         pthread_exit(NULL);     return NULL; }  int main(int argc, char** argv) {     pthread_t pid1,pid2;      pthread_mutex_init(&mutex, NULL);          if((pthread_create(&pid1,NULL,func1,NULL)) != 0)         printf("pthread create error\n");     if((pthread_create(&pid2,NULL,func2,NULL)) != 0)         printf("pthread create error\n");          pthread_join(pid1,NULL);     pthread_join(pid2,NULL);          return 0; }

user: user-4
content: 整个线程从头到尾几乎锁住，貌似再开线程没啥意思了吧。多线程场景应该是只要任务不重复即可，print耗时不一，先后也不咋要求，那么锁住n一下立即释放，类似：  pthread_mutex_lock(&mutex); int val = n++; pthread_mutex_unlock(&mutex); if (val > N)     break; //your print routine...

user: user-0
content: 引用 2 楼 user-5 的回复:可能跟操作系统时间片分配有关吧，可能一下子就执行完了，还没来得及线程切换呢，加个sleep试试加sleep确实可以轮流打印，不过会出现重复的数

user: user-5
content: 可能跟操作系统时间片分配有关吧，可能一下子就执行完了，还没来得及线程切换呢，加个sleep试试

user: user-0
content: 第101个数是另外一个线程打印的