
在学java一定要问问自己喜欢吗?只要喜欢一切没问题,这是我的建议:多敲代码,多敲代码,多敲代码,重要的事情说三遍
学习Java决不能听完敲一遍就过,一定要多敲几遍,第一遍可以跟着老师的思路,后面一定要有自己的思路,慢慢培养自己的编程思想和实现功能的逻辑。甚至可以自己给自己出题,完全靠自己实现一些有意思的小功能,对提升自己的能力和代码熟练度都有不小的帮助。
多看视频,多练习,主要是练习一些算法的运用,建议下载一些编程练习题,一道一道弄通弄懂。经常做笔记,用记事本把一些经典问题保存下来,以备复习。
如果是零基础的话,就看视频,b站上高旗老师讲得不错,每看到视频出现一段代码就马上在电脑上给他跑出来,不要直接拿源码光盘来复制,不要把视频看完半段了才开始敲代码。这样几天后你会找到一些感觉,然后没事就想些代码来写写,比如想下怎样把名字转换成乱码,然后再用另一个方法转换回来,模拟步话机发送几条消息什么的。这样下去不出3月你定牛逼,这时再把教材拿出来仔细看每一句话,掌握原理。
希望你早日学成,有苦恼一起讨论一下。
1、JS获取表格的简便方法:获取tbody:tBodies 获取thead:tHead 获取tfoot:tFoot 获取行tr:rows 获取列td:cells
使用实例: oTabletBodies[0] oTabletHead[0] oTabletFoot[0] oTablerows[1] oTablecells[1]
2、遍历
var oTable=documentgetElementById("表格id");
oTabletBodies[0]可以看成是rows和cells组成的二维数组,用两个for循环嵌套遍历一下就可以了
一个中能否添加两个js脚本 <script type=text/javascript charset=utf-8 src=要应用的js文件路径></script><script language="javascript" src=要应用的js文件路径> 加十个都没问题。只要将它们放到头标签之前就ok了。
HTML页面如何加载两个js脚本
<script src=xxx1js></script><script src=xxx2js></script>
关于 添加JS脚本函数PageOnLoad()
这是当页面初次载入时要进行的动作
<BODY onLoad="PageOnLoad()">
如何后台动态添加js脚本
1
2
3
4
function loadJs(file) {
var head = $("head")remove("script[role='reload']");
$("<scri" + "pt>" + "</scr" + "ipt>")attr({ role: 'reload', src: file, type: 'text/javascript' })appendTo(head);
}
1
2
3
4
5
6
7
8
9
10
11
function reloadAbleJSFn(id,newJS){
var oldjs = null;
var t = null;
var oldjs = documentgetElementById(id);
if(oldjs) oldjsparentNoderemoveChild(oldjs);
var scriptObj = documentcreateElement("script");
scriptObjsrc = newJS;
scriptObjtype = "text/javascript";
scriptObjid = id;
documentgetElementsByTagName("head")[0]appendChild(scriptObj);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script type=text/javascript src=/jqueryjs></script>
<script type=text/javascript>
$(function()
{
$('#loadButton')click(function(){
$getScript('newjs',function(){
newFun('"Checking new script"');这个函数是在newjs里面的,当点击click后运行这个函数
});
});
});
</script>
</head>
<body>
<button type=button id="loadButton">Load</button>
为什么我在HTML文件中加了两个js脚本,会有一个脚本不能运行呢?求解答
show me the code
F12 看报错了没有,报错行之后的代码不会执行
两个jsp页面可以共享一个js脚本么?
当然可以了,就算你的工程里每一个jsp里面都用同一个js都没问题啊
一个jframe中能否添加多个jpanel?
可以,但的注意布局,
缺省布局是borderLayout的话,东南西北中五个区域各方一个,第六个就放不了了
使用null布局,给各个jpanel直接定位即可
odoo 如何在编辑页面添加js脚本
JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种 *** 作。它最初由网景公司(Netscape)的Brendan Eich设计,是一种动态、弱类型、基于原型的语言,内置支持类。JavaScript是Sun公司的注册商标。Ecma国际以JavaScript为基础制定了ECMAScript标准。JavaScript也可以用于其他场合,如服务器端编程。完整的JavaScript实现包含三个部分:ECMAScript,文档对象模型,字节顺序记号。
Netscape公司在最初将其脚本语言命名为LiveScript。在Netscape在与Sun合作之后将其改名为JavaScript。JavaScript最初受Java启发而开始设计的,目的之一就是“看上去像Java”[2],因此语法上有类似之处,一些名称和命名规范也借自Java。但JavaScript的主要设计原则源自Self和Scheme[3]。JavaScript与Java名称上的近似,是当时网景为了营销[4]考虑与Sun公司达成协议的结果。为了取得技术优势,微软推出了JScript脚本语言。Ecma国际(前身为欧洲计算机制造商协会)创建了ECMA-262标准(ECMAScript)。现两者都属于ECMAScript的实现。尽管JavaScript作为给非程序人员的脚本语言,而非是作为给程序人员的编程语言来推广和宣传,但是JavaScript具有非常丰富的特性。
前身是Live Script
正式名称:ECMAScript
ECMAScript-262是JavaScript标准,基于网景(Netscape)公司提出JavaScript语言和微软公司提出的JScript语言
ECMA开始于1996年,在1997年7月,采纳了首个版本,1998年,该标准成为了国际ISO标准
中 在<tr>中能否添加属性
当然有啦
ACCESSKEY aessKey 设置或获取对象的快捷键。
ALIGN align 设置或获取对象相对于显示或表格的排列方式。
ATOMICSELECTION 指定元素及其内容是否可以一不可见单位统一选择。
BEGIN begin 设置或获取时间线在该元素上播放前的延迟时间。
BGCOLOR bgColor 不推荐。设置或获取对象后面的背景颜色。
BORDERCOLOR borderColor 设置或获取对象的边框颜色。
borderColorDark 设置或获取用于绘制对象 3D 边框的两种颜色的一种。
borderColorLight 设置或获取用于绘制对象 3D 边框的两种颜色的一种。
canHaveChildren 获取表明对象是否可以包含子对象的值。
canHaveHTML 获取表明对象是否可以包含丰富的 HTML 标签的值。
CH ch 设置或获取可用于实现对象的你自己的 ch 功能的字符串。
CHOFF chOff 设置或获取可用于实现对象的你自己的 chOff 功能的字符串。
CLASS className 设置或获取对象的类。
clientHeight 获取对象的高度,不计算任何边距、边框、滚动条或可能应用到该对象的补白。
clientLeft 获取 offsetLeft 属性和客户区域的实际左边之间的距离。
clientTop 获取 offsetTop 属性和客户区域的实际顶端之间的距离。
clientWidth 获取对象的宽度,不计算任何边距、边框、滚动条或可能应用到该对象的补白。
DIR dir 设置或获取对象的阅读顺序。
disabled 获取表明用户是否可与该对象交互的值。
END end 设置或获取表明元素结束时间的值,或者元素设置为重复的简单持续终止时间。
firstChild 获取对象的 childNodes 的第一个子对象的引用。
hasMedia 获取一个表明元素是否为 HTML+TIME 媒体元素的 Boolean 值。
HEIGHT height 设置或获取对象的高度。
HIDEFOCUS hideFocus 设置或获取表明对象是否显式标明焦点的值。
ID id 获取标识对象的字符串。
innerHTML 设置或获取位于对象起始和结束标签内的 HTML。
innerText 设置或获取位于对象起始和结束标签内的文本。
isContentEditable 获取表明用户是否可编辑对象内容的值。
isDisabled 获取表明用户是否可与该对象交互的值。
isMultiLine 获取表明对象的内容是包含一行还是多行的值。
isTextEdit 获取是否可使用该对象创建一个 TextRange 对象。
LANG lang 设置或获取要使用的语言。
LANGUAGE language 设置或获取当前脚本编写用的语言。
lastChild 获取该对象 childNodes 中最后一个子对象的引用。
nextSibling 获取对此对象的下一个兄弟对象的引用。
nodeName 获取特定结点类型的名称。
nodeType 获取所需结点的类型。
nodeValue 设置或获取结点的值。
offsetHeight 获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度。
offsetLeft 获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置。
offsetParent 获取定义对象 offsetTop 和 offsetLeft 属性的容器对象的引用。
offsetTop 获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置。
offsetWidth 获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的宽度。
onOffBehavior 获取表明指定的 Microsoft® DirectAnimation® 行为是否正在运行的对象。
outerHTML 设置或获取对象及其内容的 HTML 形式。
outerText 设置或获取对象的文本。
ownerDocument 设置或获取结点关联的 document 对象。
parentElement 获取对象层次中的父对象。
parentNode 获取文档层次中的父对象。
parentTextEdit 获取文档层次中可用于创建包含原始对象的 TextRange 的容器对象。
previousSibling 获取对此对象的上一个兄弟对象的引用。
readyState 获取表明对象当前状态的值。
rowIndex 获取对象在表格的 rows 中的位置。
scopeName 获取为该元素定义的命名空间。
scrollHeight 获取对象的滚动高度。
scrollLeft 设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离。
scrollTop 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离。
scrollWidth 获取对象的滚动宽度。
sectionRowIndex 获取对象位于 tBody, tHead, tFoot 或 rows 中的位置。
sourceIndex 获取对象在源序中的依次位置,即对象出现在 document 的 all 中的顺序。
STYLE 为该设置元素设置内嵌样式。
SYNCMASTER syncMaster 设置或获取时间容器是否必须在此元素上同步回放。
SYSTEMBITRATE 获取系统中大约可用带宽的 bps。
SYSTEMCAPTION 表明是否要显示文本来代替演示的的音频部分。
SYSTEMLANGUAGE 表明是否在用户计算机上的选项设置中选中了给定语言。
SYSTEMOVERDUBORSUBTITLE 指定针对那些正在观看演示但对被播放的音频所使用的语言并不熟悉的用户来说是否要渲染配音或字幕。
TABINDEX tabIndex 设置或获取定义对象的 Tab 顺序的索引。
tagName 获取对象的标签名称。
tagUrn 设置或获取在命名空间声明中指定的统一资源名称(URN)。
TIMECONTAINER timeContainer 设置或获取与元素关联的时间线类型。
TITLE title 设置或获取对象的咨询信息(工具提示)。
uniqueID 获取为对象自动生成的唯一标识符。
VALIGN vAlign 设置或获取文本和其它内容在对象内的垂直方向上如何排列。
WIDTH width 设置或获取对象的宽度。
chrome中怎么添加userjs脚本?是不是首先要安装个扩展?
直接打开小乐图客扩展的泡泡框中的JS代码功能,
将JS代码粘贴后,GO即可。
很早以前就想写写linux下多线程编程和windows下的多线程编程了,但是每当写时又不知道从哪个地方写起,怎样把自己知道的东西都写出来,下面我就谈谈linux多线程及线程同步,并将它和windows的多线程进行比较,看看他们之间有什么相同点和不同的地方。
其实最开始我是搞windows下编程的,包括windows编程,windows 驱动,包括usb驱动,ndis驱动,pci驱动,1394驱动等等,同时也一条龙服务,做windows下的应用程序开发,后面慢慢的我又对linux开发产生比较深的兴趣和爱好,就转到搞linux开发了。在接下来的我还会写一些博客,主要是写linux编程和windows编程的区别吧,现在想写的是linux下usb驱动和windows下usb驱动开发的区别,这些都是后话,等我将linux多线程和windows多线程讲解完后,我再写一篇usb驱动,谈谈windows 和linux usb驱动的东东。好了,言归正传。开始将多线程了。
首先我们讲讲为什么要采用多线程编程,其实并不是所有的程序都必须采用多线程,有些时候采用多线程,性能还没有单线程好。所以我们要搞清楚,什么时候采用多线程。采用多线程的好处如下:
(1)因为多线程彼此之间采用相同的地址空间,共享大部分的数据,这样和多进程相比,代价比较节俭,因为多进程的话,启动新的进程必须分配给它独立的地址空间,这样需要数据表来维护代码段,数据段和堆栈段等等。
(2)多线程和多进程相比,一个明显的优点就是线程之间的通信了,对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。但是对于多线程就不一样了。他们之间可以直接共享数据,比如最简单的方式就是共享全局变量。但是共享全部变量也要注意哦,呵呵,必须注意同步,不然后果你知道的。呵呵。
(3)在多cpu的情况下,不同的线程可以运行不同的cpu下,这样就完全并行了。
反正我觉得在这种情况下,采用多线程比较理想。比如说你要做一个任务分2个步骤,你为提高工作效率,你可以多线程技术,开辟2个线程,第一个线程就做第一步的工作,第2个线程就做第2步的工作。但是你这个时候要注意同步了。因为只有第一步做完才能做第2步的工作。这时,我们可以采用同步技术进行线程之间的通信。
针对这种情况,我们首先讲讲多线程之间的通信,在windows平台下,多线程之间通信采用的方法主要有:
(1)共享全局变量,这种方法是最容易想到的,呵呵,那就首先讲讲吧,比如说吧,上面的问题,第一步要向第2步传递收据,我们可以之间共享全局变量,让两个线程之间传递数据,这时主要考虑的就是同步了,因为你后面的线程在对数据进行 *** 作的时候,你第一个线程又改变了数据的内容,你不同步保护,后果很严重的。你也知道,这种情况就是读脏数据了。在这种情况下,我们最容易想到的同步方法就是设置一个bool flag了,比如说在第2个线程还没有用完数据前,第一个线程不能写入。有时在2个线程所需的时间不相同的时候,怎样达到最大效率的同步,就比较麻烦了。咱们可以多开几个缓冲区进行 *** 作。就像生产者消费者一样了。如果是2个线程一直在跑的,由于时间不一致,缓冲区迟早会溢出的。在这种情况下就要考虑了,是不让数据写入还是让数据覆盖掉老的数据,这时候就要具体问题具体分析了。就此打住,呵呵。就是用bool变量控制同步,linux 和windows是一样的。
既然讲道了这里,就再讲讲其它同步的方法。同样 针对上面的这个问题,共享全局变量同步问题。除了采用bool变量外,最容易想到的方法就是互斥量了。呵呵,也就是传说中的加锁了。windows下加锁和linux下加锁是类似的。采用互斥量进行同步,要想进入那段代码,就先必须获得互斥量。
linux上互斥量的函数是:
windows下互斥量的函数有:createmutex 创建一个互斥量,然后就是获得互斥量waitforsingleobject函数,用完了就释放互斥量ReleaseMutex(hMutex),当减到0的时候 内核会才会释放其对象。下面是windows下与互斥的几个函数原型。
HANDLE WINAPI CreateMutex(
__in LPSECURITY_ATTRIBUTES lpMutexAttributes,
__in BOOL bInitialOwner,
__in LPCTSTR lpName
);
可以可用来创建一个有名或无名的互斥量对象
第一参数 可以指向一个结构体SECURITY_ATTRIBUTES 一般可以设为null;
第二参数 指当时的函数是不是感应感应状态 FALSE为当前拥有者不会创建互斥
第三参数 指明是否是有名的互斥对象 如果是无名 用null就好。
DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle,
__in DWORD dwMilliseconds
);
第一个是 创建的互斥对象的句柄。第二个是 表示将在多少时间之后返回 如果设为宏INFINITE 则不会返回 直到用户自己定义返回。
对于linux *** 作系统,互斥也是类似的,只是函数不同罢了。在linux下,和互斥相关的几个函数也要闪亮登场了。
pthread_mutex_init函数:初始化一个互斥锁;
pthread_mutex_destroy函数:注销一个互斥锁;
pthread_mutex_lock函数:加锁,如果不成功,阻塞等待;
pthread_mutex_unlock函数:解锁;
pthread_mutex_trylock函数:测试加锁,如果不成功就立即返回,错误码为EBUSY;
至于这些函数的用法,google上一搜,就出来了,呵呵,在这里不多讲了。windows下还有一个可以用来保护数据的方法,也是线程同步的方式
就是临界区了。临界区和互斥类似。它们之间的区别是,临界区速度快,但是它只能用来同步同一个进程内的多个线程。临界区的获取和释放函数如下:
EnterCriticalSection() 进入临界区; LeaveCriticalSection()离开临界区。 对于多线程共享内存的东东就讲到这里了。
(2)采用消息机制进行多线程通信和同步,windows下面的的消息机制的函数用的多的就是postmessage了。Linux下的消息机制,我用的较少,就不在这里说了,如果谁熟悉的,也告诉我,呵呵。
(3)windows下的另外一种线程通信方法就是事件和信号量了。同样针对我开始举得例子,2个线程同步,他们之间传递信息,可以采用事件(Event)或信号量(Semaphore),比如第一个线程完成生产的数据后,就必须告诉第2个线程,他已经把数据准备好了,你可以来取走了。第2个线程就把数据取走。呵呵,这里可以采用消息机制,当第一个线程准备好数据后,就直接postmessage给第2个线程,按理说采用postmessage一个线程就可以搞定这个问题了。呵呵,不是重点,省略不讲了。
对于linux,也有类似的方法,就是条件变量了,呵呵,这里windows和linux就有不同了。要特别讲讲才行。
对于windows,采用事件和信号量同步时候,都会使用waitforsingleobject进行等待的,这个函数的第一个参数是一个句柄,在这里可以是Event句柄,或Semaphore句柄,第2个参数就是等待的延迟,最终等多久,单位是ms,如果这个参数为INFINITE,那么就是无限等待了。释放信号量的函数为ReleaseSemaphore();释放事件的函数为SetEvent。当然使用这些东西都要初始化的。这里就不讲了。Msdn一搜,神马都出来了,呵呵。神马都是浮云!
对于linux *** 作系统,是采用条件变量来实现类似的功能的。Linux的条件变量一般都是和互斥锁一起使用的,主要的函数有:
pthread_mutex_lock ,
pthread_mutex_unlock,
pthread_cond_init
pthread_cond_signal
pthread_cond_wait
pthread_cond_timewait
为了和windows *** 作系统进行对比,我用以下表格进行比较:
对照以上表格,总结如下:
(1) Pthread_cleanup_push,Pthread_cleanup_pop:
这一对函数push和pop的作用是当出现异常退出时,做一些清除 *** 作,即当在push和pop函数之间异常退出,包括调用pthread_exit退出,都会执行push里面的清除函数,如果有多个push,注意是是栈,先执行后面的那个函数,在执行前面的函数,但是注意当在这2个函数之间通过return 退出的话,执不执行push后的函数就看pop函数中的参数是不是为0了。还有当没有异常退出时,等同于在这里面return退出的情况,即:当pop函数参数不为0时,执行清除 *** 作,当pop函数参数为0时,不执行push函数中的清除函数。
(2)linux的pthread_cond_signal和SetEvent的不同点
Pthread_cond_singal释放信号后,当没有Pthread_cond_wait,信号马上复位了,这点和SetEvent不同,SetEvent是不会复位的。详解如下:
条件变量的置位和复位有2种常用模型:第一种模型是当条件变量置位时(signaled)以后,如果当前没有线程在等待,其状态会保持为置位(signaled),直到有等待的线程进入被触发,其状态才会变为unsignaled,这种模型以采用Windows平台上的Auto-set Event 为代表。
第2种模型则是Linux平台的pthread所采用的模型,当条件变量置位(signaled)以后,即使当前没有任何线程在等待,其状态也会恢复为复位(unsignaled)状态。
条件变量在Linux平台上的这种模型很难说好坏,在实际应用中,我们可以对
代码稍加改进就可以避免这种差异的发生。由于这种差异只会发生在触发没有被线程等待在条件变量的时刻,因此我们只需要掌握好触发的时机即可。最简单的做法是增加一个计数器记录等待线程的个数,在决定触发条件变量前检查该变量即可。
示例 使用 pthread_cond_wait() 和 pthread_cond_signal()
pthread_mutex_t count_lock;
pthread_cond_t count_nonzero;
unsigned count;
decrement_count()
{
pthread_mutex_lock(&count_lock);
while (count == 0)
pthread_cond_wait(&count_nonzero, &count_lock);
count = count - 1;
pthread_mutex_unlock(&count_lock);
}
increment_count()
{
pthread_mutex_lock(&count_lock);
if (count == 0)
pthread_cond_signal(&count_nonzero);
count = count + 1;
pthread_mutex_unlock(&count_lock);
}
(3) 注意Pthread_cond_wait条件返回时互斥锁的解锁问题
extern int pthread_cond_wait __P ((pthread_cond_t __cond,pthread_mutex_t __mutex));
调用这个函数时,线程解开mutex指向的锁并被条件变量cond阻塞。线程可以被函数pthread_cond_signal和函数 pthread_cond_broadcast唤醒线程被唤醒后,它将重新检查判断条件是否满足,如果还不满足,一般说来线程应该仍阻塞在这里,被等待被下一次唤醒。如果在多线程中采用pthread_cond_wait来等待时,会首先释放互斥锁,当等待的信号到来时,再次获得互斥锁,因此在之后要注意手动解锁。举例如下:
#include
#include
#include
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; /初始化互斥锁/
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; //初始化条件变量
void thread1(void );
void thread2(void );
int i=1;
int main(void)
{
pthread_t t_a;
pthread_t t_b;
pthread_create(&t_a,NULL,thread1,(void )NULL);/创建进程t_a/
pthread_create(&t_b,NULL,thread2,(void )NULL); /创建进程t_b/
pthread_join(t_b, NULL);/等待进程t_b结束/
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
exit(0);
}
void thread1(void junk)
{
for(i=1;i<=9;i++)
{
printf("IN one\n");
pthread_mutex_lock(&mutex);//
if(i%3==0)
pthread_cond_signal(&cond);/,发送信号,通知t_b进程/
else
printf("thead1:%d\n",i);
pthread_mutex_unlock(&mutex);//解锁互斥量/
printf("Up Mutex\n");
sleep(3);
}
}
void thread2(void junk)
{
while(i<9)
{
printf("IN two \n");
pthread_mutex_lock(&mutex);
if(i%3!=0)
pthread_cond_wait(&cond,&mutex);/等待/
printf("thread2:%d\n",i);
pthread_mutex_unlock(&mutex);
printf("Down Mutex\n");
sleep(3);
}
}
输出如下:
IN one
thead1:1
Up Mutex
IN two
IN one
thead1:2
Up Mutex
IN one
thread2:3
Down Mutex
Up Mutex
IN one
thead1:4
Up Mutex
IN two
IN one
thead1:5
Up Mutex
IN one
Up Mutex
thread2:6
Down Mutex
IN two
thread2:6
Down Mutex
IN one
thead1:7
Up Mutex
IN one
thead1:8
Up Mutex
IN two
IN one
Up Mutex
thread2:9
Down Mutex
注意蓝色的地方,有2个thread2:6,其实当这个程序多执行几次,i=3和i=6时有可能多打印几个,这里就是竞争锁造成的了。
(4)另外要注意的Pthread_cond_timedwait等待的是绝对时间,这个和WaitForSingleObject是不同的,Pthread_cond_timedwait在网上也有讨论。如下:这个问题比较经典,我把它搬过来。
thread_a :
pthread_mutex_lock(&mutex);
//do something
pthread_mutex_unlock(&mutex)
thread_b:
pthread_mutex_lock(&mutex);
//do something
pthread_cond_timedwait(&cond, &mutex, &tm);
pthread_mutex_unlock(&mutex)
有如上两个线程thread_a, thread_b,现在如果a已经进入了临界区,而b同时超时了,那么b会从pthread_cond_timedwait返回吗?如果能返回,那岂不是a,b都在临界区?如果不能返回,那pthread_cond_timedwait的定时岂不是就不准了?
大家讨论有价值的2点如下:
(1) pthread_cond_timedwait (pthread_cond_t cv, pthread_mutex_t external_mutex, const struct timespec abstime) -- This function is a time-based variant of pthread_cond_wait It waits up to abstime amount of time for cv to be notified If abstime elapses before cv is notified, the function returns back to the caller with an ETIME result, signifying that a timeout has occurred Even in the case of timeouts, the external_mutex will be locked when pthread_cond_timedwait returns
(2) 21 pthread_cond_timedwait行为和pthread_cond_wait一样,在返回的时候都要再次lock mutex
2 2pthread_cond_timedwait所谓的如果没有等到条件变量,超时就返回,并不确切。
如果pthread_cond_timedwait超时到了,但是这个时候不能lock临界区,pthread_cond_timedwait并不会立即返回,但是在pthread_cond_timedwait返回的时候,它仍在临界区中,且此时返回值为ETIMEDOUT。
关于pthread_cond_timedwait超时返回的问题,我也认同观点2。
附录:
int pthread_create(pthread_t restrict tidp,const pthread_attr_t restrict_attr,void(start_rtn)(void),void restrict arg);
返回值:若成功则返回0,否则返回出错编号
返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于制定各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个无指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。
linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。
由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间。restrict 数据类型不改变程序的语义。 编译器能通过作出 restrict 修饰的指针是存取对象的唯一方法的假设,更好地优化某些类型的例程。
第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
第四个参数是运行函数的参数。
因为pthread不是linux系统的库,所以在编译时注意加上-lpthread参数,以调用静态链接库。
终止线程:
如果在进程中任何一个线程中调用exit或_exit,那么整个进行会终止,线程正常的退出方式有:
(1) 线程从启动例程中返回(return)
(2) 线程可以被另一个进程终止(kill);
(3) 线程自己调用pthread_exit函数
#include
pthread_exit
线程等待:
int pthread_join(pthread_t tid,void rval_ptr)
函数pthread_join用来等待一个线程的结束。函数原型为:
extern int pthread_join __P (pthread_t __th, void __thread_return);
第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。
对于windows线程的创建东西,就不列举了,msdn上 一搜就出来了。呵呵。今天就讲到这里吧,希望是抛砖引玉,大家一起探讨,呵呵。部分内容我也是参考internet的,特此对原作者表示感谢!
以上就是关于Dreamweaver 中的“标签”是什么全部的内容,包括:Dreamweaver 中的“标签”是什么、点中表格table的一行选中当前行的多选框,用js或者jquery怎么实现在线等,急!!、java该怎么自学等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)