主机参考:VPS测评参考推荐/专注分享VPS服务器优惠信息!若您是商家可以在本站进行投稿,查看详情!此外我们还提供软文收录、PayPal代付、广告赞助等服务,查看详情! |
我们发布的部分优惠活动文章可能存在时效性,购买时建议在本站搜索商家名称可查看相关文章充分了解该商家!若非中文页面可使用Edge浏览器同步翻译!PayPal代付/收录合作 |
1。
等待pthread_join函数的线程原理用于实现线程等待。 退化参数用于传递目标线程的退出状态。 目标线程完成后,PTHREAD_JOIN存储目标线程的退出状态(即,线程函数的返回值或通过PTHREAD_EXIT传递的参数)。 换句话说,pthread_join更改void*类型变量的值,该变量指向retval指向。
以下是相关代码的示例:
#include #include #include namespace std; int g_val = 100; void *swardroutine(void *args){const char *name *)args; int cnt = 5; while(true){printf(“%s,pid:%d,g_val:%d和g_val:0x%p \ n”,name,getPid(),g_val,&g_val);睡眠(1); cnt--; if(cnt == 0)休息; } pthread_exit(((void *)100);} int main(){pthread_t pid; pthread_create(&pid,nullptr,threadRoutine,(void *)“ thread 1”); void *ret; pthread_join(piD,&ret); cout <<“返回的线程:” <<(long long int)ret << endl; 0;通过上述代码和图像;}
。您可以看到新线程的输出参数可以在主线程中检索。所有线程都是共享资源的全局变量,因此所有线程都可以访问全局功能。
&重述接收退出状态的特定过程是:当调用pthread_join时,pthread_join会阻止当前线程,直到线程参数完成中指定的目标线程为止。 当目标线程终止时,PTHREAD_JOIN分配了一个void*指针(即出口状态),该指针调用pthread_exit时在线程中传递。 PTHREAD_JOIN成功完成等待和状态检索后,0返回,表明操作成功,当前线程可以继续执行后续代码。
2。本地存储
线程的全局变量均由所有线程共享。 如果线程需要自己的私人数据,即只能由其本身而不能通过其他线程访问,则可以通过在全局变量之前添加关键字__线程来修改它。这是编译器提供的关键字,只能用于修改内置类型。
以下是相关代码的示例:
#include #include #include #include <vector <vetrude #include #define num 3int *p = nullptr;ublic:threadinfo(const string&threadName):threadName_(threadName){} public:string threadName_;};字符串Tohex(pthread_t tid){char buffer [64]; snprintf(缓冲,sizeof(缓冲区),“%p”,tid);返回buffer;} void *threadRoutine(void *args){int i = 0; threadinfo *ti = static_cast (args);而(i threadname_.c_str(),tohex(pthread_self()。++ ++ ++; val ++; i ++; i + +; i ++; i +; i +; sleep(1);} thread_datas;read_t tid; pthread_create(&tid,nullptr,threadRoutine,&thread_datas.back()); tids.push_back(tid); } for(auto tid:tids){pthread_join(tid,nullptr); }返回0;}
通过观察相同的线程,val值增加,但对于不同的线程,它与val值无关。 因此,通过关键字__ thread属于独立线程堆栈中每个线程阀的地址的thehread来实现线程的本地存储。
3。对相互线程排除的初步理解关键领域:在每个线程中,访问关键资源的代码称为关键区域。 相互排除:任何时候,只有一个执行流进入关键领域,访问关键资源(保护关键资源)。 原子性:不被调度机制打断的操作是不可分割的动作。此操作只有两个状态。一个是完整的,另一个是不完整的(在早期化学中,在这种情况下提出了原子性)。
在大多数情况下,线程使用的数据是局部变量,该变量的地址空间位于线程堆栈空间中。在这种情况下,变量属于一个线程,没有其他线程可以检索此变量。 但是,有时可能需要在线程之间共享许多变量。这些变量称为共享变量,线程之间的交互可以通过数据共享完成。
相互排除的原因
当每个线程访问共享变量时,多个过程可以同时运行,从而导致多个问题。
以下是一个经典的票证抢购问题。每个线程将投票数减少到共享资源。这相当于偷票。
以下是相关代码的示例:
#include #include #include #include #include #include namespace std; #define num 4class threaddata {public:public:threaddata(int number){swreetName =“ swreet-” + to“ to” + to(swersName =“ + to); } public:string threadName;}; int ticket = 1000; void *getTicket(void *args){threaddata *td = static_cast (args); const char *name = td-> threadName.c_str(); while(true){if(ticket> 0){usleep(1000); printf(“谁=%s,获取票:%d \ n”,姓名,票证);票 - ; } else Break; } printf(“%s ... quit \ n”,name);返回nullptr;} int main(){vector tids;向量 thread_datas; for(int i = 1; i <= num; i ++){thread_datas.emplace_back(i); pthread_t tid; pthread_create(&tid,nullptr,getTicket和thread_datas.back()); tids.push_back(tid); } for(auto tid:tids){pthread_join(tid,nullptr); }返回0;}
在第两次运行程序:
第一个:
second:
second:
second:
second:
second:
>
second:
second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second:
Second: <p
First of all, if we're discussing only one thread, the entire process of grabbing the票证是票证在内存中,线程读取票证,线程将票务变量放在CPU上,CPU执行操作,然后将其返回到内存中以覆盖原始值。 假设,这个过程非常慢?因此,阅读门票后,我也阅读了其他线程。最终,在整个回合运行后,当他们一起运行时,原始价值的1000为999,都抓住了1000张票。因此,我们一遍又一遍地抓住了同一张票。 这也是负数的原因,但是返回记忆的行为并未同时执行。 当CPU执行计算时,必须重新阅读数据。如果所有线程都有门票== 1首先,则确定可以在此处通过。接下来,一个线程将获得最后一张票1,另外三个则获得“假票” 0,-1和-2。这就是为什么要执行过程相互排斥的原因。
有关PHP速度学习视频的免费教程(向初学者学习)
如何学习PHP? 如何开始PHP? 我在哪里可以学习PHP? 如何立即学习PHP? 不用担心,这是PHP速度学习教程(向初学者学习)。需要它的朋友可以保存和下载并学习它!
下载
这几篇文章你可能也喜欢:
- 如何使用日志优化数据库性能(如何使用日志来优化数据库性能模式)
- 如何查看有关使用目录足迹DU命令的提示
- 如何查看Linux用户的登录历史记录? 最后和最后的日志命令分析
- 什么是Linux服务器?
- 如何在Linux上压缩和解解码? TAR命令软件包压缩的一般用法概述
本文由主机参考刊发,转载请注明:[详细了解Linux线程控件(Linux线程分析) https://zhujicankao.com/147129.html
评论前必须登录!
注册