#include<iostream>
#include<pthread.h>
#include<ctime>
#include<windows.h> using namespace std; const int Num=;
int tally = ;//glable
pthread_mutex_t mutex;
pthread_cond_t cond;
void* ThreadProc(void* t)
{ Sleep();
pthread_mutex_lock(&mutex);//上锁
tally += ;
int p=*(int*)t;
Sleep();
// printf("线程编号为%d 全局资源值为%d\n", p, tally);
cout<<"线程编号为:"<<p<<","<<"全局资源值为:"<<tally<<'\n';
pthread_cond_signal(&cond); //发送信号
pthread_mutex_unlock(&mutex);//解锁
int s=p+;
pthread_exit((void *)s);
} int main(int argc, char* argv[])
{
ios::sync_with_stdio(false);
for(int j=;j<;j++)
{
tally=;
pthread_t statues[Num];
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
int index[Num];
pthread_mutex_init (&mutex, NULL); //对锁初始化,必须的
pthread_cond_init(&cond,NULL); //初始化信号量
for(int i=;i<Num;i++)
{
index[i]=i;
int rec=pthread_create(&statues[i],&attr,ThreadProc, (void*)& index[i]); //create success,return 0
pthread_cond_wait(&cond,&mutex); // 等待接受信号
if(rec != )
{
throw "thread create failed";
exit(-);
}
}
pthread_attr_destroy(&attr);
void *s;
for(int i=;i<Num;i++)
{
int ret=pthread_join(statues[i], &s);
if(ret!=)
{
throw "thread create failed";
exit(-);
}
cout<<(int)s<<endl;
}
cout<<tally<<endl;
} pthread_exit(NULL); //main 通过pthread_exit()退出时,其它线程仍会执行。
return ;
}

线程执行的顺序是混乱无序的,出现1号线程先于0号线程执行的原因是:在0号线程停留在Sleep(50)的时候,1号线程创建并抢先执行完毕。

将pthread_mutex_lock(&mutex)上锁放在Sleep之前就可以让线程号从0~9了,但这样子就失去多线程的价值了

总结:

1,用互斥锁来完成线程之间的互斥操作,对临街资源的操作可以用原子操作或者互斥锁来完成。

2,用信号量来完成线程之间的同步操作,通过控制信号量,选择执行哪条线程。

自己理解学习的记录,水平渣,可能会有很多错误~

C++多线程(POSIX)的更多相关文章

  1. posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序

    posix 线程(一):线程模型.pthread 系列函数 和 简单多线程服务器端程序 一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属 ...

  2. OS之进程管理---多线程模型和线程库(POSIX PTread)

    多线程简介 线程是CPU使用的基本单元,包括线程ID,程序计数器.寄存器组.各自的堆栈等,在相同线程组中,所有线程共享进程代码段,数据段和其他系统资源. 传统的的单线程模式是每一个进程只能单个控制线程 ...

  3. Pthread:POSIX 多线程程序设计【转】

    转自:http://www.cnblogs.com/mywolrd/archive/2009/02/05/1930707.html#phtread_ref POSIX 多线程程序设计  Blaise ...

  4. posix多线程--线程取消

    1.三种取消状态Off                   禁用取消Deferred           推迟取消:在下一个取消点执行取消Asynchronous   异步取消:可以随时执行取消 in ...

  5. posix多线程--三种基本线程编程模型

    本文介绍了三种构建线程解决方案的方式. 一.流水线:每个线程执行同一种操作,并把操作结果传递给下一步骤的线程. 代码示例如下:终端输入一个int值,每个线程将该值加1,并将结果传给下一个线程. #in ...

  6. posix多线程--条件变量

    条件变量是用来通知共享数据状态信息的. 1.条件变量初始化两种方式:(1)静态初始化pthread_cond_t cond = PTHREAD_COND_INITIALIZER;代码示例如下: #in ...

  7. posix多线程--互斥量

    多线程程序在线程间共享数据时,如果多个线程同时访问共享数据就可能有问题.互斥量是解决多个线程间共享数据的方法之一. 1.互斥量初始化两种方式:(1)静态初始化 #include <pthread ...

  8. [posix]Posix多线程编程

    就不排版了,可以到原作者博客下看 转自:http://www.cnblogs.com/zhangsf/archive/2013/09/09/3309867.html 目录表  摘要 译者序 Pthre ...

  9. 多线程编程之Apue3rd_Chapter15.10之posix信号量

    看了APUE的chapter15,只重点看了15.10,学习了posix信号量.Posix信号量比起xsi信号量的优点是性能更好,在Linux3.2.0平台上性能提升很大.其中命名信号量使用方法如下. ...

随机推荐

  1. Win7系统桌面便签怎么添加?

    参考:http://jingyan.baidu.com/article/ab69b270c207432ca7189f99.html Win7系统桌面便签怎么添加?有时候工作.学习忙起来就会忘记要办的事 ...

  2. Redis实现之字典

    字典 字典,又称为符号表(symbol table).关联数组(associative array)或映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构.在字典中,一个 ...

  3. Apache Compress-使用

    Apache Compress 是什么? Apache  提供的文件压缩工具. 运行环境 jdk 1.7 commons-compress 1.15 测试代码 package com.m.basic; ...

  4. C#入门篇5-7:流程控制语句 continue语句

    #region continue语句 public class ContinueApp { public static void Fun1() { //标签打印显示1…30,若能被3整除则不打印. ; ...

  5. Memcached相关内容总结

    1.Memcached常用命令总结 Memcached命令格式一般为: command 其中描述如下: 参数 描述 command 操作命令,一般为set/add/replace/get/delete ...

  6. C#中var、int、object性能比较(已修正)

    var关键字是.net3.5推出的关键字,主要是让编译器自动推断并判断变量类型,类似javascript中的var. 在使用一些性能优化软件时,在代码优化时,我发现不管定义什么类型的变量,变量的类型都 ...

  7. FreeBSD利用 ports 來安裝軟體

    FreeBSD利用 ports 來安裝軟體   利用 ports 來安裝軟體 FreeBSD 的 ports 就是別人已經編譯過,安裝測試沒問題了,他們將軟體編譯時所需的組態設定.編譯程序及安裝程序, ...

  8. Codeforces 1063D Candies for Children

    题目大意 给定整数 $n, k, l, r$,$1\le n, k \le 10^{11}$,$1\le l, r \le n$ . 令 $ m = r - l + 1$,若 $m \le 0$,$m ...

  9. [HEOI2016/TJOI2016][bzoj4555] 求和 [斯特林数+NTT]

    题面 传送门 思路 首先,我们发现这个式子中大部分的项都和$j$有关(尤其是后面的$2^j\ast j!$),所以我们更换一下枚举方式,把这道题的枚举方式变成先$j$再$i$ $f(n)=\sum_{ ...

  10. codechef May Challenge 2016 LADDU: Ladd 模拟

    All submissions for this problem are available. Read problems statements in Mandarin Chinese, Russia ...