linux下多线程,不使用全局变量,填充文本数据

zcmerlin 2017-05-23 04:02:34
线程1和线程2交替执行完成文本文件的数据填充。
线程1完成奇数行的填充,线程2完成偶数行的填充,各填充5遍

结果应如下:
thread 1 : 1
thread 2 : 2
thread 1 : 3
thread 2 : 4
thread 1 : 5
thread 2 : 6
thread 1 : 7
thread 2 : 8
thread 1 : 9
thread 2 : 10

*要求是不能使用全局变量进行线程同步

刚学多线程这里,还不太熟悉,自己没想到什么比较好的思路,请大家给个思路吧,具体需要用到什么函数之类的也请讲一讲

...全文
549 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
忘世麒麟 2017-05-24
  • 打赏
  • 举报
回复
//线程1和线程2交替执行完成文本文件的数据填充。
//线程1完成奇数行的填充,线程2完成偶数行的填充,各填充5遍

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
struct lockData
{
    int             value;
    pthread_mutex_t mutex;
    pthread_cond_t  cond;
};
typedef struct lockData lockData;
void writefile(int num)
{
    FILE *fp;
    if( (fp=fopen("demo.txt","a+")) == NULL )
    {
        printf("Cannot open file, press any key exit!");
        getchar();
        exit(1);
    }
    fprintf(fp,"%d\n", num); 
    fclose(fp);
}

lockData* initThreadData(int arg)
{
    lockData *fp;
    fp = (lockData*)malloc(sizeof(lockData));
    if(fp == NULL)
    {
        printf("malloc err!\n");
        return NULL;
    }
    int status = 0;
    status = pthread_mutex_init(&fp->mutex,NULL);
    if(status !=0)
    {
        printf("mutex init err!");
        free(fp);
        return NULL;
    }
    status = pthread_cond_init(&fp->cond,NULL);
    if(status != 0)
    {
        printf("cond init err!\n");
        free(fp);
        return NULL;
    }
    fp->value = arg;
    return (fp);
}
void *dojob1(void* arg)
{
    lockData *data = (lockData*)arg;
    while(data->value<=10)
    {
        pthread_mutex_lock(&data->mutex);
        while(data->value %2 == 0)              //线程1 写奇数 ,因此,他要写的数据应该 X%2 !=0,假如x%2==0 说明应该等另外一个线程对X做自增操作
            pthread_cond_wait(&data->cond,&data->mutex);
        writefile(data->value);
        data->value +=1;
        pthread_cond_signal(&data->cond);
        pthread_mutex_unlock(&data->mutex);
    }
    return (void*)0;
}

void *dojob2(void *arg)
{
    lockData *data = (lockData*)arg;
    while(data->value <=10)
    {
        pthread_mutex_lock(&data->mutex);
	    while(data->value %2 !=0 )              //线程2 写偶数,因此要写的书应该是 X%2==0 ,假如不是,则应该等另外一个线程对X做自增操作
	        pthread_cond_wait(&data->cond,&data->mutex);
        writefile(data->value);
        data->value +=1;
        pthread_cond_signal(&data->cond);
        pthread_mutex_unlock(&data->mutex);
    }
    return (void*)0;
}

int main()
{
    lockData *data = initThreadData(1);
    pthread_t id1,id2;
    pthread_create(&id1,NULL,dojob1,(void*)data);
    pthread_create(&id2,NULL,dojob2,(void*)data);
    
    printf("[thr1:%u]  [thr2:%ld]",(unsigned int)id1,(unsigned int)id2);
    void* status1 = 0;
    void* status2 = 0;
    pthread_join(id1,&status1);
    pthread_join(id2,&status2);
    if(data != NULL)
        free(data);
    data = NULL;
    printf("down!%d %d\n",(long)status1,(long)status2);
    return 0;    
}
仅供参考,某一种实现!
赵4老师 2017-05-23
  • 打赏
  • 举报
回复
引用 8 楼 zcmerlin 的回复:
[quote=引用 7 楼 zhao4zhong1 的回复:] 百度搜pthread_cond_wait
嗯嗯,也看到这个了,用这个可以在两个线程之间来回跳吧[/quote] 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
zcmerlin 2017-05-23
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
百度搜pthread_cond_wait
嗯嗯,也看到这个了,用这个可以在两个线程之间来回跳吧
赵4老师 2017-05-23
  • 打赏
  • 举报
回复
百度搜pthread_cond_wait
zcmerlin 2017-05-23
  • 打赏
  • 举报
回复
引用 5 楼 baijiaheizhiganmao 的回复:
分析问题:根据题意,可以让线程1 写第一个数字,然后线程2 总是写第二个数字.即: 线程1: 1 S 3 S 5 S 7 S 9 结束 线程2:S 2 S 4 S 6 S 8 S 10 结束 S 表示睡眠一小段时间 每次写的线程X写的时候,先判断文件最后一个数字是否是“满足它写下一个数字的条件”,不满足就继续sleep 否则在前一个数字基础上 +1 写入文件中。即: 线程1 在中间某次写的时候,判断文件最后一个数字X是否是偶数,且 X+1 <=10,是的话,表示可以写了,不是的话有两种情况,A:前面数组是奇数,说明此次应该是线程2 写;B:前面的数字是10 则说明它写完5次应该退出了. 至于:线程同步的方式,自己找资料看.
我本来写的也是用sleep,连互斥锁都没用,全部用时间间隔错开, 但要求不让用全局变量,还不让用sleep。。。 我想了想,能不能用pthread_cond_wait在两个线程之间跳来跳去,可是又不知道怎么实现。。。
忘世麒麟 2017-05-23
  • 打赏
  • 举报
回复
分析问题:根据题意,可以让线程1 写第一个数字,然后线程2 总是写第二个数字.即: 线程1: 1 S 3 S 5 S 7 S 9 结束 线程2:S 2 S 4 S 6 S 8 S 10 结束 S 表示睡眠一小段时间 每次写的线程X写的时候,先判断文件最后一个数字是否是“满足它写下一个数字的条件”,不满足就继续sleep 否则在前一个数字基础上 +1 写入文件中。即: 线程1 在中间某次写的时候,判断文件最后一个数字X是否是偶数,且 X+1 <=10,是的话,表示可以写了,不是的话有两种情况,A:前面数组是奇数,说明此次应该是线程2 写;B:前面的数字是10 则说明它写完5次应该退出了. 至于:线程同步的方式,自己找资料看.
zcmerlin 2017-05-23
  • 打赏
  • 举报
回复
引用 2 楼 baijiaheizhiganmao 的回复:
就用这个例子,将线程同步的方法和实现熟悉一遍吧!
可以给个思路么。。 用全局变量基本会实现了,但不用的话,还没什么思路。。
zcmerlin 2017-05-23
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
百度搜相关关键字。
搜到的都是用全局变量同步的呀
忘世麒麟 2017-05-23
  • 打赏
  • 举报
回复
就用这个例子,将线程同步的方法和实现熟悉一遍吧!
赵4老师 2017-05-23
  • 打赏
  • 举报
回复
百度搜相关关键字。

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧