【新人】问一个线程同步的有关问题
【新人】问一个线程同步的问题
线程函数
int WINAPI tp(LPVOID lpParam)
{
int i = 1;
i += 100;
cout << i << endl;
return 0;
}
如果我创建了3个线程,都使用这个线程函数,那么i是不是很不安全啊?
我开始以为, 每个线程开始执行这个函数的时候, 都会自己开辟一个栈内存 i , 每个线程都有自己的i
但是看到同步的时候,貌似我上面的想法是错的。
我觉得一个可能会这样:
当一个线程开始执行的时候开辟了一个 栈内存 i。
可能这个时候CPU转到第二个线程来执行这个函数, 然后又定义一次 i.
这个时候我就晕了, 同名字的变量怎么能在同一个栈内存区中定义多次呢?
然后一个线程执行了 i += 100; 后面马上要执行 输出语句了。
但是这个时候又有一个刚创建的新线程来执行这个函数,然后又定义了一次i
而这个时候,CPU跳会原来的输出线程那里去,再输出的时候,i的值是不是变成了1呢? 还是不变啊。
一个线程函数理的局部变量(或所以代码)是被所有使用这个函数的线程共用的呢 还是 每个线程有一个自己的副本。
线程间并不相互影响啊?
如果是共用, 那么多个线程, 重复去定义同一个局部变量,这样的事情怎么去理解呢?
如果是共用, 怎么才能让 一个线程函数理的局部变量(或所以代码)都成为每个使用该函数的线程的副本呢?
好晕啊 求指教啊··谢谢了。
------解决方案--------------------
安全啊,都是局部变量
每个线程都有自己的栈
------解决方案--------------------
每个线程中的局部变量都是有它各自的副本,只要线程中操作的变量不是全局变量或者静态变量就不会出什么错误。
------解决方案--------------------
每个线程都有自己的i,代码是共用的
------解决方案--------------------
看看这个
http://blog.****.net/feixiaoxing/article/details/7001999
线程函数
int WINAPI tp(LPVOID lpParam)
{
int i = 1;
i += 100;
cout << i << endl;
return 0;
}
如果我创建了3个线程,都使用这个线程函数,那么i是不是很不安全啊?
我开始以为, 每个线程开始执行这个函数的时候, 都会自己开辟一个栈内存 i , 每个线程都有自己的i
但是看到同步的时候,貌似我上面的想法是错的。
我觉得一个可能会这样:
当一个线程开始执行的时候开辟了一个 栈内存 i。
可能这个时候CPU转到第二个线程来执行这个函数, 然后又定义一次 i.
这个时候我就晕了, 同名字的变量怎么能在同一个栈内存区中定义多次呢?
然后一个线程执行了 i += 100; 后面马上要执行 输出语句了。
但是这个时候又有一个刚创建的新线程来执行这个函数,然后又定义了一次i
而这个时候,CPU跳会原来的输出线程那里去,再输出的时候,i的值是不是变成了1呢? 还是不变啊。
一个线程函数理的局部变量(或所以代码)是被所有使用这个函数的线程共用的呢 还是 每个线程有一个自己的副本。
线程间并不相互影响啊?
如果是共用, 那么多个线程, 重复去定义同一个局部变量,这样的事情怎么去理解呢?
如果是共用, 怎么才能让 一个线程函数理的局部变量(或所以代码)都成为每个使用该函数的线程的副本呢?
好晕啊 求指教啊··谢谢了。
------解决方案--------------------
安全啊,都是局部变量
每个线程都有自己的栈
------解决方案--------------------
每个线程中的局部变量都是有它各自的副本,只要线程中操作的变量不是全局变量或者静态变量就不会出什么错误。
------解决方案--------------------
每个线程都有自己的i,代码是共用的
------解决方案--------------------
看看这个
http://blog.****.net/feixiaoxing/article/details/7001999