首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

如何用C语言实现两个线程在Linux环境下打印1~100

2013-10-29 
怎么用C语言实现两个线程在Linux环境下打印1~100#include stdlib.h#include stdio.h#include unistd.

怎么用C语言实现两个线程在Linux环境下打印1~100

#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);


void *func1()
{
        while(n < N+1)
        {
                pthread_mutex_lock(&mutex);
                printf("%d 1\n",n);
                n++;
                pthread_mutex_unlock(&mutex);
        }
        if(n == N+1)
                pthread_exit(NULL);
}

void *func2()
{
        while(n < N+1)
        {
                pthread_mutex_lock(&mutex);
                printf("%d 2\n",n);
                n++;
                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;
}


本人用到的锁是没用的,进入循环后另一个线程就没法抢占了,结果都是一个线程打印的。并且会打印101个数。求教程序该怎么写?实现两个线程交替打印,每个线程打印个数固定/不固定。 c语言
[解决办法]
可能跟操作系统时间片分配有关吧,可能一下子就执行完了,还没来得及线程切换呢,加个sleep试试
[解决办法]
整个线程从头到尾几乎锁住,貌似再开线程没啥意思了吧。多线程场景应该是只要任务不重复即可,print耗时不一,先后也不咋要求,那么锁住n一下立即释放,类似:

pthread_mutex_lock(&mutex);
int val = n++;
pthread_mutex_unlock(&mutex);
if (val > N)
    break;
//your print routine...
[解决办法]

#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;
}

热点排行