For last few versions of Visual Studio (at least from VS2005, maybe even older) all CRT functions relies on some special things being set up in _beginthreadex. Any CRT function that relies on this stuff will check if that was done and in case if that was not done (if you used CreateThread) it will set everything up. So you don't need to worry about using CreateThread vs _beginthreadex.
If you are not using CRT then using CreateThread will actually be a bit faster and using less memory - because you won't be setting up CRT stuff you don't use.
To see this in actual CRT source you can examine "strtok" function implementation. As you know strtok stores in internal state some information about next token. So for every thread it should be different. This is achieved by TLS. If you look at "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src\strtok.c" source file you'll notice
| _ptiddata ptd = _getptd();
|
statement.
You can find _getptd function in "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src\tidtable.c" file:
| /***
*_ptiddata _getptd(void) - get per-thread data structure for the current thread
|
It's implementation executes following code:
| if ( (ptd = __crtFlsGetValue(__flsindex)) == NULL ) {
/*
* no per-thread data structure for this thread. try to create
* one.
*/
...
}
...
return(ptd);
|
As you can see - it checks if per-thread structure for this thread is allocated and if not it allocates new one.