69,371
社区成员
发帖
与我相关
我的任务
分享
void thread_fun1(void *args) {
int i;
for(i=0; i<TESTN; i++) {
EnterCriticalSection (&critical_section);
sprintf(buf, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#"
);
printf("[thread 1] %03d | %s\n", i, buf); // printf 一般是线程安全的
LeaveCriticalSection (&critical_section);
}
}
2.只用CriticalSection保护sprintf,结果:字符发生了混合;这说明:即使printf是安全的,但它保护的并不是整个字符串;猜测也许是一段一段保护的,当然只是猜测。
void thread_fun1(void *args) {
int i;
for(i=0; i<TESTN; i++) {
EnterCriticalSection (&critical_section);
sprintf(buf, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#"
);
LeaveCriticalSection (&critical_section);
printf("[thread 1] %03d | %s\n", i, buf); // printf 一般是线程安全的
}
}
3.只用CriticalSection保护printf,结果:字符发生了混合;参考结果2,个人觉得,也许sprintf没保护;也许sprintf保护了,但不是整个字符串。
void thread_fun1(void *args) {
int i;
for(i=0; i<TESTN; i++) {
sprintf(buf, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#",
"#","#","#","#","#","#","#","#","#","#"
);
EnterCriticalSection (&critical_section);
printf("[thread 1] %03d | %s\n", i, buf); // printf 一般是线程安全的
LeaveCriticalSection (&critical_section);
}
}
4.不使用CriticalSection,当然发生了混合。
#include <stdio.h>
#include <pthread.h>
#ifdef WIN32
#include <windows.h>
#define msleep(ms) Sleep((ms))
#else
#include <unistd.h>
#define msleep(ms) usleep((ms)*1000)
#endif
#define TESTN 10
#define DELAY 100
char buf[1024];
pthread_t tid1, tid2;
void *thread_fun1(void *args) {
int i;
for(i=0; i<TESTN; i++) {
sprintf(buf, "%s%s%s%s%s%s%s%s%s%s",
"#","#","#","#","#","#","#","#","#","#" );
printf("[thread 1] %03d | %s\n", i, buf); // printf 一般是线程安全的
}
}
void *thread_fun2(void *args) {
int i;
for(i=0; i<TESTN; i++) {
sprintf(buf, "%s%s%s%s%s%s%s%s%s%s",
".",".",".",".",".",".",".",".",".","." );
printf("[THREAD 2] %03d | %s\n", i, buf); // printf 一般是线程安全的
}
}
int main(int argc, char *argv[])
{
pthread_create(&tid1, NULL, thread_fun1, NULL);
pthread_create(&tid2, NULL, thread_fun2, NULL);
msleep(100);
return 0;
}
MinGW编译,连续运行10次,重定位到spts.txt:
for /L %i in (1,1,10) do @echo test %i... & @a >> spts.txt
得到spts.txt(同一行内出现两种字符的就是因为sprintf内没有加锁):
[thread 1] 000 | ##########
[thread 1] 001 | ##########
[thread 1] 002 | ##########
[thread 1] 003 | ##########
[thread 1] 004 | ##########
[thread 1] 005 | ##########
[thread 1] 006 | ##########
[thread 1] 007 | ##########
[thread 1] 008 | ##########
[thread 1] 009 | ##########
[THREAD 2] 000 | ..........
[THREAD 2] 001 | ..........
[THREAD 2] 002 | ..........
[THREAD 2] 003 | ..........
[THREAD 2] 004 | ..........
[THREAD 2] 005 | ..........
[THREAD 2] 006 | ..........
[THREAD 2] 007 | ..........
[THREAD 2] 008 | ..........
[THREAD 2] 009 | ..........
[thread 1] 000 | ##########
[thread 1] 001 | ##########
[thread 1] 002 | ##########
[thread 1] 003 | ##########
[thread 1] 004 | ##########
[thread 1] 005 | ##########
[thread 1] 006 | ##########
[thread 1] 007 | ##########
[thread 1] 008 | ##########
[thread 1] 009 | ##########
[THREAD 2] 000 | ..........
[THREAD 2] 001 | ..........
[THREAD 2] 002 | ..........
[THREAD 2] 003 | ..........
[THREAD 2] 004 | ..........
[THREAD 2] 005 | ..........
[THREAD 2] 006 | ..........
[THREAD 2] 007 | ..........
[THREAD 2] 008 | ..........
[THREAD 2] 009 | ..........
[thread 1] 000 | ##########
[thread 1] 001 | ##########
[thread 1] 002 | ##########
[thread 1] 003 | ##########
[thread 1] 004 | ##########
[thread 1] 005 | ##########
[thread 1] 006 | ##########
[thread 1] 007 | ##########
[thread 1] 008 | ##########
[thread 1] 009 | ##########
[THREAD 2] 000 | ..........
[THREAD 2] 001 | ..........
[THREAD 2] 002 | ..........
[THREAD 2] 003 | ..........
[THREAD 2] 004 | ..........
[THREAD 2] 005 | ..........
[THREAD 2] 006 | ..........
[THREAD 2] 007 | ..........
[THREAD 2] 008 | ..........
[THREAD 2] 009 | ..........
[thread 1] 000 | ##########
[thread 1] 001 | ##########
[thread 1] 002 | ##########
[thread 1] 003 | ...#######
[THREAD 2] 000 | ##########
[thread 1] 004 | ..........
[THREAD 2] 001 | ##########
[thread 1] 005 | ..........
[THREAD 2] 002 | ##########
[thread 1] 006 | ..........
[THREAD 2] 003 | ##########
[thread 1] 007 | ..........
[THREAD 2] 004 | ##########
[thread 1] 008 | ..........
[THREAD 2] 005 | ##########
[thread 1] 009 | ..........
[THREAD 2] 006 | ..........
[THREAD 2] 007 | ..........
[THREAD 2] 008 | ..........
[THREAD 2] 009 | ..........
[thread 1] 000 | ##########
[thread 1] 001 | ##########
[thread 1] 002 | ##########
[thread 1] 003 | ##########
[thread 1] 004 | ##########
[thread 1] 005 | ##########
[thread 1] 006 | ##########
[thread 1] 007 | ##########
[thread 1] 008 | ##########
[thread 1] 009 | ##########
[THREAD 2] 000 | ..........
[THREAD 2] 001 | ..........
[THREAD 2] 002 | ..........
[THREAD 2] 003 | ..........
[THREAD 2] 004 | ..........
[THREAD 2] 005 | ..........
[THREAD 2] 006 | ..........
[THREAD 2] 007 | ..........
[THREAD 2] 008 | ..........
[THREAD 2] 009 | ..........
[thread 1] 000 | ##########
[thread 1] 001 | ##########
[thread 1] 002 | ##########
[thread 1] 003 | ##########
[thread 1] 004 | ##########
[thread 1] 005 | ##########
[thread 1] 006 | ##########
[thread 1] 007 | ##########
[thread 1] 008 | ##########
[thread 1] 009 | ##########
[THREAD 2] 000 | ..........
[THREAD 2] 001 | ..........
[THREAD 2] 002 | ..........
[THREAD 2] 003 | ..........
[THREAD 2] 004 | ..........
[THREAD 2] 005 | ..........
[THREAD 2] 006 | ..........
[THREAD 2] 007 | ..........
[THREAD 2] 008 | ..........
[THREAD 2] 009 | ..........
[thread 1] 000 | ##########
[thread 1] 001 | ..........
[thread 1] 002 | ##########
[THREAD 2] 000 | ##########
[thread 1] 003 | ..........
[THREAD 2] 001 | ##########
[thread 1] 004 | ..........
[THREAD 2] 002 | ##########
[thread 1] 005 | ..........
[THREAD 2] 003 | ##########
[thread 1] 006 | ..........
[THREAD 2] 004 | ##########
[thread 1] 007 | ..........
[THREAD 2] 005 | ##########
[thread 1] 008 | ..........
[THREAD 2] 006 | ##########
[thread 1] 009 | ..........
[THREAD 2] 007 | ..........
[THREAD 2] 008 | ..........
[THREAD 2] 009 | ..........
[thread 1] 000 | ##########
[thread 1] 001 | ##########
[thread 1] 002 | ##########
[thread 1] 003 | ##########
[thread 1] 004 | ##########
[thread 1] 005 | ..........
[THREAD 2] 000 | ##########
[thread 1] 006 | ..........
[THREAD 2] 001 | ##########
[thread 1] 007 | ..........
[THREAD 2] 002 | ##########
[thread 1] 008 | ..........
[THREAD 2] 003 | ##########
[thread 1] 009 | ..........
[THREAD 2] 004 | ..........
[THREAD 2] 005 | ..........
[THREAD 2] 006 | ..........
[THREAD 2] 007 | ..........
[THREAD 2] 008 | ..........
[THREAD 2] 009 | ..........
[thread 1] 000 | ##########
[THREAD 2] 000 | ##########
[thread 1] 001 | ..........
[THREAD 2] 001 | ##########
[thread 1] 002 | ..........
[THREAD 2] 002 | ##########
[thread 1] 003 | ..........
[THREAD 2] 003 | ##########
[thread 1] 004 | ..........
[THREAD 2] 004 | ##########
[thread 1] 005 | ..........
[THREAD 2] 005 | ##########
[thread 1] 006 | ..........
[THREAD 2] 006 | ##########
[thread 1] 007 | ..........
[THREAD 2] 007 | ##########
[thread 1] 008 | ..........
[THREAD 2] 008 | ##########
[thread 1] 009 | ..........
[THREAD 2] 009 | ..........
[thread 1] 000 | ##########
[thread 1] 001 | #######...
[thread 1] 002 | ##########
[THREAD 2] 000 | ##########
[thread 1] 003 | ..........
[THREAD 2] 001 | ##########
[thread 1] 004 | ..........
[THREAD 2] 002 | ##########
[thread 1] 005 | ..........
[THREAD 2] 003 | ##########
[thread 1] 006 | ..........
[THREAD 2] 004 | ##########
[thread 1] 007 | ..........
[THREAD 2] 005 | ##########
[thread 1] 008 | ..........
[THREAD 2] 006 | ##########
[thread 1] 009 | ..........
[THREAD 2] 007 | ..........
[THREAD 2] 008 | ..........
[THREAD 2] 009 | ..........